Flutter 如何将文本文件作为文件打开后保存对其所做的更改?
我在内存中有一个文本文件,我使用file.readAsString()打开它。。这将从中提取文本并将其保存为字符串。这是一个TextField(),因此可以对此文本进行更改 如何有效地将这些更改保存回原始文件 这是到目前为止我的代码。一切按原样工作,文件打开,其中的文本显示在文本字段中。但是我不知道如何将更改保存回文件Flutter 如何将文本文件作为文件打开后保存对其所做的更改?,flutter,dart,Flutter,Dart,我在内存中有一个文本文件,我使用file.readAsString()打开它。。这将从中提取文本并将其保存为字符串。这是一个TextField(),因此可以对此文本进行更改 如何有效地将这些更改保存回原始文件 这是到目前为止我的代码。一切按原样工作,文件打开,其中的文本显示在文本字段中。但是我不知道如何将更改保存回文件 class _NoteEditScreenState extends State<NoteEditScreen> { TextEditingController
class _NoteEditScreenState extends State<NoteEditScreen> {
TextEditingController _controller;
String startingText = '';
String fileName;
@override
void initState() {
super.initState();
getTextFromFile().whenComplete(() {
//when we read the string, extract lines from it
lines = lineSplitter.convert(startingText);
setState(() {
_controller = TextEditingController(text: startingText);
});
});
fileName = widget.txtPath.split('/').last;
}
Future getTextFromFile() async {
final file = File(widget.txtPath);
//read the file
String contents = await file.readAsString();
startingText = contents;
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text(fileName),
backgroundColor: Colors.teal,
centerTitle: true,
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
onPressed: (){
showSearch(context: context, delegate: TextSearch(lines));
},
),
],
),
body: Center(
child: Container(
padding: EdgeInsets.all(5.0),
//height: 50.0,
child: TextField(
maxLines: null,
controller: _controller,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.teal),
//borderRadius: BorderRadius.all(Radius.circular(20.0))
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.red),
//borderRadius: BorderRadius.all(Radius.circular(20.0))
),
),
),
),
),
class\u NoteEditScreenState扩展状态{
TextEditingController\u控制器;
字符串startingText='';
字符串文件名;
@凌驾
void initState(){
super.initState();
getTextFromFile()。当完成(){
//当我们读取字符串时,从中提取行
lines=lineSplitter.convert(开始文本);
设置状态(){
_控制器=文本编辑控制器(文本:开始文本);
});
});
fileName=widget.txtPath.split(“/”).last;
}
将来的getTextFromFile()异步{
最终文件=文件(widget.txtPath);
//读文件
String contents=wait file.readAsString();
开始文本=内容;
}
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
appBar:appBar(
标题:文本(文件名),
背景颜色:Colors.teal,
标题:对,
行动:[
图标按钮(
图标:图标(Icons.search),
已按下:(){
showSearch(上下文:上下文,委托:文本搜索(行));
},
),
],
),
正文:中(
子:容器(
填充:所有边缘设置(5.0),
//身高:50.0,
孩子:TextField(
maxLines:null,
控制器:_控制器,
装饰:输入装饰(
enabledBorder:OutlineInputBorder(
borderSide:borderSide(颜色:Colors.teal),
//边界半径:边界半径。全部(半径。圆形(20.0))
),
聚焦顺序:大纲输入边框(
borderSide:borderSide(颜色:Colors.red),
//边界半径:边界半径。全部(半径。圆形(20.0))
),
),
),
),
),
我的看法是删除旧文件并创建一个同名的新文件。这是最好的方法吗?或者你们能建议一个更好的方法吗?要写入文件,可以使用
yourFile.writeAsString(contents)
或yourFile.writeAsStringSync(contents)
如果您不想等待文件完全写入或不想阻止应用程序执行,请使用writeastringsync
,如果您想阻止应用程序继续,直到写入完成
肯定有比你建议的更好的方法。我建议你看看
文件
类。谢谢,我知道writeAsString()
,但我的问题是保存对读取文本的同一文件的更改。调用writeAsString()会吗
覆盖同一个文件?是的。您正在该文件上调用它。这不会追加数据,而是覆盖。因此,理想情况下,您将文件加载到内存中,编辑内容,然后将新字符串写入文件,替换旧内容。问题是您在read方法中创建了该文件。请尝试在更高的范围内创建该文件并将其传递给方法,这样您就可以访问同一个文件,而不是先打开它进行读取,然后再打开它进行写入。但是,正确的方法是不要在小部件中处理该文件。小部件用于向用户显示数据,而不是处理数据。覆盖取决于文件模式
。默认情况下,它将verwrite,但是您可以通过将FileMode
更改为FileMode.append
来轻松地追加数据。