Flutter中如何更新本地JSON文件数据?
解决Flutter本地JSON文件更新问题
首先明确:Flutter项目中assets目录下的JSON文件是只读的,无法直接修改。如果你的JSON文件放在assets里,必须先复制到应用的可写沙盒目录,之后才能修改。如果已经是存放在可写目录,直接读写即可。
步骤1:添加依赖
需要path_provider获取应用可写目录,在pubspec.yaml中添加:
dependencies: flutter: sdk: flutter path_provider: ^2.1.0
执行flutter pub get完成依赖安装。
步骤2:核心工具方法
获取可写目录路径
import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'dart:convert'; import 'package:flutter/services.dart'; Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; } Future<File> get _localJsonFile async { final path = await _localPath; // 替换成你的JSON文件名,比如data.json return File('$path/data.json'); }
复制assets中的JSON到可写目录(仅首次启动执行)
如果原始JSON在assets目录(比如assets/data.json),先在pubspec.yaml中声明资产:
flutter: assets: - assets/data.json
然后添加复制方法:
Future<void> copyAssetToLocal() async { final localFile = await _localJsonFile; if (!await localFile.exists()) { final byteData = await rootBundle.load('assets/data.json'); final buffer = byteData.buffer; await localFile.writeAsBytes(buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); } }
在APP启动时调用该方法,示例:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await copyAssetToLocal(); runApp(const MyApp()); }
步骤3:读取并修改JSON数据
读取JSON为Map结构
Future<Map<String, dynamic>> readJsonData() async { try { final file = await _localJsonFile; final contents = await file.readAsString(); return jsonDecode(contents); } catch (e) { // 读取失败返回默认空结构 return {"title": "", "lists": []}; } }
修改JSON数据(以更新lists中id为127的qty为例)
Future<void> updateJsonData() async { final jsonData = await readJsonData(); // 定位目标条目并修改字段 for (var item in jsonData['lists']) { if (item['id'] == '127') { item['qty'] = '150'; // 修改qty值 item['rec_date'] = DateTime.now().toString(); // 更新修改时间 break; } } // 也可以添加新条目到lists数组 // jsonData['lists'].add({ // "id": "128", // "faci_code": "20019", // // 补充其他必填字段 // }); // 将修改后的数据写入文件 final file = await _localJsonFile; await file.writeAsString(jsonEncode(jsonData)); }
额外建议:使用模型类(可选,更规范)
如果JSON结构固定,建议用json_serializable生成模型类,避免手动操作Map出错:
- 添加依赖:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
- 定义模型类:
import 'package:json_annotation/json_annotation.dart'; part 'data_model.g.dart'; @JsonSerializable() class DataModel { final String title; final List<ListItem> lists; DataModel({required this.title, required this.lists}); factory DataModel.fromJson(Map<String, dynamic> json) => _$DataModelFromJson(json); Map<String, dynamic> toJson() => _$DataModelToJson(this); } @JsonSerializable() class ListItem { final String id; final String faci_code; final String qty; // 补充其他字段 ListItem({required this.id, required this.faci_code, required this.qty, /* 其他字段 */}); factory ListItem.fromJson(Map<String, dynamic> json) => _$ListItemFromJson(json); Map<String, dynamic> toJson() => _$ListItemToJson(this); }
- 执行
flutter pub run build_runner build生成序列化代码,之后即可通过模型类安全读写JSON数据。
内容的提问来源于stack exchange,提问作者vandet
相关产品推荐
相关产品推荐

