颤动:将文本小部件转换为JSON

时间:2020-01-28 03:21:17

标签: flutter dart

如何将文本小部件(和其他小部件)转换为JSON?

我正在尝试将对象保存到SharedPreferences,但是令人难以置信的是,我似乎找不到任何信息。我希望可以像DateTime一样做一些事情使它可以JSON转换。

我的活动课:

class Activity {
  String state;
  bool visible;
  DateTime visibleAfter;
  bool firstView;
  Widget menuText;
  Widget route;

  Activity(this.state, this.visible, this.visibleAfter, this.firstView, this.menuText, this.route);

  Map<String, dynamic> toJson() => {
        'state': state,
        'visible': visible,
        'visibleAfter': visibleAfter.toIso8601String(),
        'firstView': firstView,
        'menuText': menuText,
        'route': route,
      };

  factory Activity.fromJson(Map<String, dynamic> json) {
    return new Activity(
        json['state'], json['visible'], DateTime.parse(json['visibleAfter']), json['firstView'], json['menuText'], json['route']);
  }
}

如果我尝试编写它,则会收到一个错误消息(注意:在对象中没有Widget的情况下,编写工作仍然可以正常进行)

json.encode(
    activityStates.map((k, v) => MapEntry(k, v.toJson())),
    /////// Unhandled Exception: Converting object to an encodable object failed: Instance of 'Text'
));

/*   These include routes that I would like to map to, like WelcomeScreen
var defaultActivityStates = {
  'Welcome': Activity('review', true, DateTime.now(), false, Text('welcome'), WelcomeScreen),
  'SingleDigitEdit': Activity('todo', true, DateTime.now(), false, Text('test'), SingleDigitEditScreen),
  'SingleDigitPractice': Activity('todo', true, DateTime.now(), false, Text('test'), SingleDigitPractice), 
}
*/

1 个答案:

答案 0 :(得分:0)

您的menuText是一个小部件(它是类的实例)。您无法将其序列化为JSON,因为JSON仅支持简单类型。而是序列化字符串内容。

class Activity {
  String state;
  bool visible;
  DateTime visibleAfter;
  bool firstView;
  String menuText; // change to String

menuText是字符串而不是窗口小部件时,它将序列化为JSON。您想在任何地方将其用作小部件,只需使用Text(menuText)