You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Dart同页面如何保存加载变量实现新游戏/继续游戏功能

最简实现方案
  • 无需单独创建与NewGameRoute逻辑几乎完全一致的ContinueGameRoute,同一个游戏路由组件通过接收不同初始参数即可分流新游戏、继续游戏两种场景,从根源避免冗余代码。
  • 两个变量的本地持久化直接使用轻量键值对存储方案即可,无需接入重量级本地数据库,完全满足需求。
具体落地步骤
  1. 变量持久化写入
    每次点击OK触发_nextCSV()方法、更新_listCount与assetPath变量后,同步将最新值写入本地存储,参考代码:
    // 获取存储实例后执行写入
    final prefs = await SharedPreferences.getInstance();
    await prefs.setInt('saved_listCount', _listCount);
    await prefs.setString('saved_assetPath', assetPath);
    
  2. 改造游戏路由构造函数
    给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";
      }
    
      // 其余原有业务逻辑保持不变
    }
    
  3. 区分两个按钮的跳转逻辑
    • 点击「新游戏」按钮时,直接无参跳转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,
            ),
          ),
        );
      }
    }
    
  4. 子组件传参补全
    游戏页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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:06:17