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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:45:30