Flutter桌面应用创建新文件后如何向新建文件写入数据
问题根源
你当前代码里的LocalStorage实例用final修饰、路径硬编码写死,实例一旦初始化完成,所有读写操作都会固定指向初始的todos/todo.json文件,自然无法切换写入目标。
具体修改步骤
- 第一步:调整状态变量定义,去掉storage的硬编码初始化,新增当前选中文件名的状态
把原来的final LocalStorage storage = LocalStorage('Todos/todo.json');替换为以下代码:late LocalStorage storage; String currentFileName = 'todo'; // 默认选中初始的todo.json - 第二步:新增通用的存储文件切换方法,负责初始化新存储实例、加载对应文件数据、更新全局状态
在类中新增如下方法:Future<void> _switchStorage(String targetFileName) async { // 生成目标文件对应的LocalStorage实例 final newStorage = LocalStorage('Todos/$targetFileName.json'); // 等待存储实例初始化完成,否则读写会报错 await newStorage.ready; // 读取目标文件中已保存的待办数据 final savedData = newStorage.getItem('todo') ?? []; setState(() { // 替换全局存储实例 storage = newStorage; // 更新当前选中的文件名 currentFileName = targetFileName; // 同步更新内存中的待办列表,切换后显示对应文件的内容 list.items = List<TodoItem>.from( savedData.map((item) => TodoItem(title: item['title'], text: item['text'])) ); }); } - 第三步:调整初始启动逻辑,应用启动初始化完目录和默认文件后,加载默认存储实例
修改initState和_createFileFolderFirstStart逻辑:@override void initState() { super.initState(); // 启动时先创建默认目录和文件,再加载默认存储 _createFileFolderFirstStart().then((_) { _switchStorage('todo'); }); } Future<void> _createFileFolderFirstStart() async { rootPath = await getApplicationDocumentsDirectory(); Directory sampleFolder = Directory('${rootPath!.path}/Todos'); if (!sampleFolder.existsSync()) { sampleFolder.createSync(recursive: true); } File sampleFile = File('${sampleFolder.path}/todo.json'); if (!sampleFile.existsSync()) { sampleFile.createSync(); } } - 第四步:修改新文件创建逻辑,文件创建完成后自动切换存储目标到新文件
把原来的_createNewFile方法替换为:Future<void> _createNewFile() async { final newFileName = _filenameController.text.trim(); if (newFileName.isEmpty) return; rootPath = await getApplicationDocumentsDirectory(); Directory sampleFolder = Directory('${rootPath!.path}/Todos'); if (!sampleFolder.existsSync()) { sampleFolder.createSync(recursive: true); } File sampleFile = File('${sampleFolder.path}/$newFileName.json'); if (!sampleFile.existsSync()) { sampleFile.createSync(); } // 新文件创建完成后,直接切换存储到该文件 await _switchStorage(newFileName); _filenameController.clear(); setState(() {}); } - 第五步:修正创建按钮的调用逻辑,原来的数组包裹写法无法正确等待异步执行,直接绑定方法即可
把创建文件的ElevatedButton的onPressed参数改为:onPressed: _createNewFile,
可选优化
你可以在UI中新增一个下拉选择组件,读取Todos目录下所有已存在的json文件,选中任意文件时调用_switchStorage方法,就能实现任意已创建文件的切换,不需要局限于刚创建的新文件。
注意事项
- 每次新建LocalStorage实例后必须等待
ready异步完成再进行读写操作,否则会抛出未初始化错误 - 切换存储文件时必须同步更新内存中的待办列表数据,否则界面会残留上一个文件的内容,造成数据写入错乱
- 原有保存、清空存储的逻辑不需要修改,因为这些方法操作的是全局的storage变量,切换实例后会自动作用到新选中的文件上
内容的提问来源于stack exchange,提问作者CDC
相关产品推荐
相关产品推荐

