Flutter 如何将文本文件作为文件打开后保存对其所做的更改?

Flutter 如何将文本文件作为文件打开后保存对其所做的更改?,flutter,dart,Flutter,Dart,我在内存中有一个文本文件,我使用file.readAsString()打开它。。这将从中提取文本并将其保存为字符串。这是一个TextField(),因此可以对此文本进行更改 如何有效地将这些更改保存回原始文件 这是到目前为止我的代码。一切按原样工作,文件打开,其中的文本显示在文本字段中。但是我不知道如何将更改保存回文件 class _NoteEditScreenState extends State<NoteEditScreen> { TextEditingController

我在内存中有一个文本文件,我使用file.readAsString()打开它。。这将从中提取文本并将其保存为字符串。这是一个TextField(),因此可以对此文本进行更改

如何有效地将这些更改保存回原始文件

这是到目前为止我的代码。一切按原样工作,文件打开,其中的文本显示在文本字段中。但是我不知道如何将更改保存回文件

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
来轻松地追加数据。