내부저장소에 데이타 읽고쓰기
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class FileApp extends StatefulWidget {
const FileApp({Key? key}) : super(key: key);
@override
_FileAppState createState() => _FileAppState();
}
class _FileAppState extends State<FileApp> {
int _count = 0;
//과일항목을 담을 리스트를 선언한다.
List<String> itemList = [];
TextEditingController _controller = TextEditingController();
//########################
// sharedPreference 을 체크해서
// 처음이면 defaultAssetsBundel 을 이용해서
// repo/fruit.txt 을 읽어서 내부저장소에 fruit.txt 로 저장하고
// 리스트에 내용을 담는내용..,
//########################
Future<List<String>> loadListFile() async {
List<String> loadItemList = [];
var key = 'first';
//1.공유환경설정에서 firstCheck 내용을 확인한다.
SharedPreferences pref = await SharedPreferences.getInstance();
bool firstCheck = pref.getBool(key) as bool;
//var firstCheck = false;
//2.내부저장소에서 fruit.txt 화일이 있는지 확인한다.
var dir = await getApplicationDocumentsDirectory();
bool fileExist = await File(dir.path + '/fruit.txt').exists();
//3.처음이거나 해당화일이
// 없으면 ..,
// pref 에 key 값을 true 로 설정해 준다.
// assets 의 fruit.txt 를 불러와서
// 내부저장소에 저장하고 리스트를 만들고
// 있으면 내부저장소에서 데이타를 불어와서 리스트를 만든다.
if (firstCheck == false || fileExist == false) {
print('1.############# DefaultAssetBundel');
//1.공유환경설정
pref.setBool(key, true);
//2.assets 의 내용 읽어오기
// var file =
// await DefaultAssetBundle.of(context).loadString('repo/fruit.txt');
var file =
await DefaultAssetBundle.of(context).loadString('repo/fruit.txt');
//3.내부저장소에 저장해 준다.
var dir = await getApplicationDocumentsDirectory();
File(dir.path + '/fruit.txt').writeAsStringSync(file);
//4.file 내용을 리스트에 담는다.
var array = file.split('\n');
for (var item in array) {
loadItemList.add(item);
}
return loadItemList;
} else {
print('2.############# File(dir.path + fruit.txt).readAsString()');
//있으면 내부저장소의 내용을 읽어와서 리스트에 담어 던진다.
var dir = await getApplicationDocumentsDirectory();
var file = await File(dir.path + '/fruit.txt').readAsString();
var arr = file.split('\n');
for (var item in arr) {
loadItemList.add(item);
}
return loadItemList;
}
}
@override
void initState() {
// ignore: todo
// TODO: implement initState
super.initState();
//readCountFile
readCountFile();
//loadListFile() 을 호출해서 리스트를 반환받아서
//listItem 에 넣어 화면에 반영한다.
initData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My File Example'),
),
body: Container(
child: Center(
child: Column(
children: [
TextField(
controller: _controller,
keyboardType: TextInputType.text,
),
//card 를 가진 ListView.builder
Expanded(
child: ListView.builder(
itemCount: itemList.length,
itemBuilder: (context, index) {
return Card(
child: Center(
child: Text(
itemList[index],
style: TextStyle(fontSize: 30),
),
),
);
}),
)
],
)),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
//###############
// 내부저장소의 내용끝에 추가해서 넣어준다.
//###############
writeFruit(_controller.value.text);
//#### 리스트에 과일 추가하기
setState(() {
itemList.add(_controller.value.text);
});
// writeFruit(controller.value.text);
// setState(() {
// itemList.add(controller.value.text);
// });
writeCountFile(_count);
},
child: Icon(Icons.add),
),
);
}
//화일에 내용을 쓴다.
void writeCountFile(int count) async {
var dir = await getApplicationDocumentsDirectory();
File(dir.path + '/count.txt').writeAsStringSync(count.toString());
}
//화일을 읽어온다.
void readCountFile() async {
//읽어올 파일을 지정한다.
try {
var dir = await getApplicationDocumentsDirectory();
var file = await File(dir.path + '/count.txt').readAsString();
print(file);
setState(() {
_count = int.parse(file);
});
} catch (e) {
print(e.toString());
}
}
void initData() async {
//###
// 처음이면 assets ==> 내부저장소 ==> list
// 두번재이면 내부저장소 ==> list
var result = await loadListFile();
//화면에 반영해야 하므로 setState
setState(() {
itemList.addAll(result);
});
}
void writeFruit(String text) async {
var dir = await getApplicationDocumentsDirectory();
var file = File(dir.path + '/fruit.txt').readAsStringSync();
file = file + '\n' + text;
File(dir.path + '/fruit.txt').writeAsStringSync(file);
}
}