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
相关产品推荐
相关产品推荐

