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

Flutter问题:如何让DayExercisePage各实例拥有独立的todaysExercises列表

解决每个DayExercisePage实例拥有独立训练列表的问题

问题核心是所有页面实例共用了同一个SharedPreferences存储键todaysExercises,导致数据互相覆盖、加载同一份内容。要实现独立列表,需要给每个页面分配唯一标识,并基于这个标识生成专属的存储键。

步骤1:给DayExercisePage添加唯一标识参数

首先修改DayExercisePage类,添加一个用于区分不同实例的参数(比如日期、自定义ID):

class DayExercisePage extends StatefulWidget {
  // 新增:每个页面的唯一标识,例如日期字符串"2024-05-20"或自定义ID
  final String dayIdentifier;

  const DayExercisePage({super.key, required this.dayIdentifier});

  @override
  _DayExercisePageState createState() => _DayExercisePageState();
}

步骤2:修改数据加载/保存逻辑,使用专属存储键

在_DayExercisePageState中,基于传入的dayIdentifier生成唯一的存储键,替换原来固定的todaysExercises:

class _DayExercisePageState extends State<DayExercisePage> {
  List<Exercise> todaysExercises = [];

  // 生成当前页面专属的存储键
  String get _exerciseStorageKey => 'todaysExercises_${widget.dayIdentifier}';

  // Load data from shared preferences
  Future<List<Exercise>> loadData() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    final String? myDataString = prefs.getString(_exerciseStorageKey);
    if (myDataString != null) {
      final List<dynamic> myDataJson = jsonDecode(myDataString);
      todaysExercises =
          myDataJson.map((dynamic item) => Exercise.fromMap(item)).toList();
    } else {
      // 新页面初始化空列表
      todaysExercises = [];
    }
    return todaysExercises;
  }

  // Save Todays exercieses to shared preferences
  Future<void> saveData() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    final List<dynamic> myDataJson =
        todaysExercises.map((Exercise exercise) => exercise.toMap()).toList();
    final String myDataString = jsonEncode(myDataJson);
    await prefs.setString(_exerciseStorageKey, myDataString);
  }
}

步骤3:跳转页面时传入唯一标识

在点击卡片跳转的地方,给每个DayExercisePage传入不同的dayIdentifier,比如用日期区分:

// 示例:点击某一天的卡片时跳转
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => DayExercisePage(dayIdentifier: "2024-05-20"),
  ),
);

这样每个DayExercisePage实例都会读写自己专属的SharedPreferences键,数据完全独立,不会互相干扰。

内容的提问来源于stack exchange,提问作者Rob Morrison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:47:20