Flutter/Dart同页面如何保存加载变量实现新游戏/继续游戏功能
最简实现方案
- 无需单独创建与
NewGameRoute逻辑几乎完全一致的ContinueGameRoute,同一个游戏路由组件通过接收不同初始参数即可分流新游戏、继续游戏两种场景,从根源避免冗余代码。 - 两个变量的本地持久化直接使用轻量键值对存储方案即可,无需接入重量级本地数据库,完全满足需求。
具体落地步骤
- 变量持久化写入
每次点击OK触发_nextCSV()方法、更新_listCount与assetPath变量后,同步将最新值写入本地存储,参考代码:// 获取存储实例后执行写入 final prefs = await SharedPreferences.getInstance(); await prefs.setInt('saved_listCount', _listCount); await prefs.setString('saved_assetPath', assetPath); - 改造游戏路由构造函数
给NewGameRoute增加两个可选命名参数用于接收初始值,参数未传入时默认使用新游戏的初始配置,参考代码:class NewGameRoute extends StatefulWidget { final int? initListCount; final String? initAssetPath; const NewGameRoute({super.key, this.initListCount, this.initAssetPath}); @override State<NewGameRoute> createState() => _NewGameRouteState(); } class _NewGameRouteState extends State<NewGameRoute> { late int _listCount; late String assetPath; @override void initState() { super.initState(); // 优先使用传入的存档值,无传入值则加载新游戏默认配置 _listCount = widget.initListCount ?? 0; assetPath = widget.initAssetPath ?? "files/main.jpg"; } // 其余原有业务逻辑保持不变 } - 区分两个按钮的跳转逻辑
- 点击「新游戏」按钮时,直接无参跳转
NewGameRoute(),组件自动加载默认初始值 - 点击「继续游戏」按钮时,先从本地存储读取之前持久化的两个变量,再作为参数传入路由,参考代码:
// 继续游戏按钮点击逻辑 onPressed: () async { final prefs = await SharedPreferences.getInstance(); final savedCount = prefs.getInt('saved_listCount') ?? 0; final savedPath = prefs.getString('saved_assetPath') ?? "files/main.jpg"; if (mounted) { Navigator.push( context, MaterialPageRoute( builder: (context) => NewGameRoute( initListCount: savedCount, initAssetPath: savedPath, ), ), ); } } - 点击「新游戏」按钮时,直接无参跳转
- 子组件传参补全
游戏页build方法中返回ListFromCSV组件时,必须将状态里维护的_listCount、assetPath作为必填参数传入,即写为return ListFromCSV(listCount: _listCount, assetPath: assetPath);。
编译报错原因说明
- 第一次修改出现的构造函数语法错误、命名参数不存在、const构造函数调用不合法、final字段未初始化问题,均为Dart构造函数书写不规范导致:要么是未给组件类中定义的final字段配置正确的构造参数映射,要么是误将可选参数定义为必填参数后,在const调用场景未传参。
- 第二次修改剩余的
The named parameter 'assetPath' is required, but there's no corresponding argument报错,是因为ListFromCSV组件将listCount、assetPath定义为了必填命名参数,但build方法中初始化组件时未传入对应值,补全传参后即可解决,这也是最终功能可正常运行的关键修复点。
内容的提问来源于stack exchange,提问作者Texter
相关产品推荐
相关产品推荐

