Flutter中如何分时机加载不同本地JSON文件并通过Future传参
结论
完全可以通过向异步方法传变量的方式实现该需求,这也是这类场景下的常规实现方案,不需要为每个JSON文件单独编写重复的加载、解析逻辑。
具体实现
- 首先在项目的
pubspec.yaml文件中注册3个JSON文件的资源路径,和引入本地图片、其他静态资源的配置规则一致。 - 编写通用的异步加载方法,接收区分不同JSON的参数,参数可以直接传资源路径字符串,也可以传自定义枚举值避免手滑写错路径,方法内部根据传入参数加载对应文件、解码后返回结果。
最基础的传路径版本示例:
更稳妥的枚举映射版本示例(避免硬编码路径写错):import 'dart:convert'; import 'package:flutter/services.dart' show rootBundle; /// 传入本地JSON的资源路径,返回解析后的结构化数据 Future<Map<String, dynamic>> loadJsonByPath(String assetPath) async { final String rawContent = await rootBundle.loadString(assetPath); return jsonDecode(rawContent); }enum LocalJsonFile { appConfig, goodsCategory, userDefaultSetting } Future<Map<String, dynamic>> loadJson(LocalJsonFile fileType) async { // 统一维护枚举和实际资源路径的映射关系 final pathMapping = { LocalJsonFile.appConfig: 'assets/app_config.json', LocalJsonFile.goodsCategory: 'assets/goods_category.json', LocalJsonFile.userDefaultSetting: 'assets/user_setting.json', }; final String rawContent = await rootBundle.loadString(pathMapping[fileType]!); return jsonDecode(rawContent); } - 在对应业务时机调用通用方法,传入匹配的参数即可拿到对应JSON的数据:
- App启动初始化全局配置时,调用
loadJson(LocalJsonFile.appConfig) - 进入商品列表页加载本地分类数据时,调用
loadJson(LocalJsonFile.goodsCategory) - 进入个人设置页加载默认配置项时,调用
loadJson(LocalJsonFile.userDefaultSetting)
- App启动初始化全局配置时,调用
补充说明
由于3个JSON结构相似,你可以直接在通用方法中补充模型类转换的逻辑,直接返回对应的实体类对象,省去每次调用后重复做解析的步骤。后续如果需要新增同结构的本地JSON文件,只需要把新文件注册到pubspec.yaml中,在枚举/映射里加一条对应关系,调用时传入新的参数即可,不需要修改原有加载逻辑,维护成本更低。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

