Flutter中如何为预定义类实现fromMap与toMap方法
为Flutter预定义类实现fromMap和toMap方法
针对你给出的Session类,由于涉及第三方库的非原生可序列化类型(TableCalendar、LocalDate),需要手动实现类型与Map的转换逻辑。首先要注意:TableCalendar是UI组件,不适合作为数据类的成员变量存储,这类组件包含大量UI状态,无法直接序列化,建议替换为对应的配置或数据类型(比如CalendarFormat或日期值)。以下是修正后的实现方案:
完整实现代码
import 'dart:convert'; import 'package:table_calendar/table_calendar.dart'; import 'package:time_machine/time_machine.dart'; class Session { // 替换TableCalendar为合理的日期配置类型,这里用CalendarFormat示例 final CalendarFormat calendarFormat; final LocalDate localDate; final DateTime dateTime; Session({ required this.calendarFormat, required this.localDate, required this.dateTime, }); // 将Session转为Map Map<String, dynamic> toMap() { return { 'calendarFormat': calendarFormat.name, // 枚举转字符串存储 'localDate': localDate.toEpochDays, // 用epoch天数存储LocalDate,避免字符串格式问题 'dateTime': dateTime.toIso8601String(), // DateTime转标准字符串 }; } // 从Map构建Session factory Session.fromMap(Map<String, dynamic> map) { return Session( calendarFormat: CalendarFormat.values.firstWhere( (format) => format.name == map['calendarFormat'], orElse: () => CalendarFormat.month, // 设置默认值避免异常 ), localDate: LocalDate.fromEpochDays(map['localDate'] as int), dateTime: DateTime.parse(map['dateTime'] as String), ); } // 可选:快速转JSON字符串 String toJson() => json.encode(toMap()); // 可选:从JSON字符串构建Session factory Session.fromJson(String source) => Session.fromMap(json.decode(source)); }
关键类型转换说明
CalendarFormat(table_calendar枚举):通过name属性转为字符串存储,反序列化时通过values.firstWhere匹配枚举值,同时设置默认值避免解析异常。LocalDate(time_machine库):使用toEpochDays转为整数存储,比字符串更高效且无格式歧义;反序列化用LocalDate.fromEpochDays直接还原。DateTime:用原生的toIso8601String()和DateTime.parse()完成标准转换,兼容性强且不易出错。
关于原代码中的TableCalendar
如果坚持要保留与TableCalendar相关的配置,只能提取其核心业务参数(比如选中日期、聚焦日期、显示格式等)单独序列化,而不能直接存储组件对象。例如:
// 示例:提取TableCalendar的核心业务配置 final DateTime selectedDay; final DateTime focusedDay; final CalendarFormat calendarFormat;
然后针对这些配置字段实现序列化逻辑,而非直接处理TableCalendar组件本身。
内容的提问来源于stack exchange,提问作者Aadi
相关产品推荐
相关产品推荐

