如何在Flutter中定义类似JSON对象的变量?
Flutter 存储题目数据的最优方案
首先纠正你的误解:Map<String, dynamic>完全可以存储多组key-value对,你想要的结构直接用Map就能实现,不需要嵌套Map。
方案一:直接使用Map
这是最快捷的实现方式,适合简单场景:
// 初始化变量 Map<String, dynamic> question = { 'title': '', 'description': '', 'questionTitle': '', 'option1Text': '', 'option2Text': '', 'option3Text': '', 'option1Correctness': false, 'option2Correctness': false, 'option3Correctness': false, 'questionNumber': 1, }; // 表单保存值的写法和你之前的示例一致 onSaved: (value) { question['title'] = value!; },
方案二:自定义实体类(更优方案)
如果你的项目复杂度较高,或者需要多次复用这个数据结构,推荐创建自定义Model类——相比Map,它有类型检查和IDE自动补全的优势,能避免拼写key时的低级错误(比如把title写成titile),代码可读性也更高。
示例代码:
class Question { String title; String description; String questionTitle; String option1Text; String option2Text; String option3Text; bool option1Correctness; bool option2Correctness; bool option3Correctness; int questionNumber; // 构造函数 Question({ required this.title, required this.description, required this.questionTitle, required this.option1Text, required this.option2Text, required this.option3Text, required this.option1Correctness, required this.option2Correctness, required this.option3Correctness, required this.questionNumber, }); // 转成Map(用于本地存储或接口请求) Map<String, dynamic> toJson() => { 'title': title, 'description': description, 'questionTitle': questionTitle, 'option1Text': option1Text, 'option2Text': option2Text, 'option3Text': option3Text, 'option1Correctness': option1Correctness, 'option2Correctness': option2Correctness, 'option3Correctness': option3Correctness, 'questionNumber': questionNumber, }; // 从Map转成Question对象 factory Question.fromJson(Map<String, dynamic> json) => Question( title: json['title'] ?? '', description: json['description'] ?? '', questionTitle: json['questionTitle'] ?? '', option1Text: json['option1Text'] ?? '', option2Text: json['option2Text'] ?? '', option3Text: json['option3Text'] ?? '', option1Correctness: json['option1Correctness'] ?? false, option2Correctness: json['option2Correctness'] ?? false, option3Correctness: json['option3Correctness'] ?? false, questionNumber: json['questionNumber'] ?? 1, ); }
使用方式:
// 初始化 Question question = Question( title: '', description: '', questionTitle: '', option1Text: '', option2Text: '', option3Text: '', option1Correctness: false, option2Correctness: false, option3Correctness: false, questionNumber: 1, ); // 表单保存时直接操作属性 onSaved: (value) { question.title = value!; },
两种方案对比
- Map:快速实现,无需额外代码,适合临时或简单场景
- 自定义类:类型安全,可读性强,适合复杂项目或需要复用的结构
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

