Flutter Dart JSONECODE给我错误未处理异常:将对象转换为可编码对象失败

Flutter Dart JSONECODE给我错误未处理异常:将对象转换为可编码对象失败,flutter,dart,Flutter,Dart,我在编写代码时出错 未处理的异常:将对象转换为可编码对象失败:“字对”的实例 我已经阅读了关于json_注释和json_可序列化的内容,但我不知道它们对我的情况有何帮助。当我无法访问“WordPair”类时,我不知道如何使用它 在代码中,我们使用english_words包获得随机的“字对”。我正在尝试将用户选择的一些喜爱的单词保存到共享首选项中。但我不知道如何使列表可序列化。我对飞镖和飞镖很陌生。请帮忙 import "package:flutter/material.dart"; impor

我在编写代码时出错

未处理的异常:将对象转换为可编码对象失败:“字对”的实例

我已经阅读了关于json_注释和json_可序列化的内容,但我不知道它们对我的情况有何帮助。当我无法访问“WordPair”类时,我不知道如何使用它

在代码中,我们使用english_words包获得随机的“字对”。我正在尝试将用户选择的一些喜爱的单词保存到共享首选项中。但我不知道如何使列表可序列化。我对飞镖和飞镖很陌生。请帮忙

import "package:flutter/material.dart";
import "package:english_words/english_words.dart";
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  final _randomWordPairs = <WordPair>[];
  final _savedWordPairs = Set<WordPair>();

  Future<void> _setSavedWordPairs() async {
    List<WordPair> savedWordPairsList = _savedWordPairs.toList();
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString("wordpairs", jsonEncode(savedWordPairsList));
    print(prefs.getString("wordpairs"));
  }

  Future<void> _getSavedWordPairs() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String savedWordPairsString =
        prefs.getString("wordpairs") ?? jsonEncode(<WordPair>[]);
    List<WordPair> savedWordPairsList = jsonDecode(savedWordPairsString);
    print(savedWordPairsList);
    setState(() {
      _randomWordPairs.addAll(savedWordPairsList);
      _savedWordPairs.addAll(savedWordPairsList);
    });
  }

  Widget _buildList() {
    return ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (context, item) {
        if (item.isOdd) return Divider();

        final index = item ~/ 2;

        if (index >= _randomWordPairs.length) {
          _randomWordPairs.addAll(generateWordPairs().take(10));
        }

        return _buildRow(_randomWordPairs[index]);
      },
    );
  }

  Widget _buildRow(WordPair pair) {
    final alreadySaved = _savedWordPairs.contains(pair);

    return ListTile(
      title: Text(pair.asPascalCase, style: TextStyle(fontSize: 18.0)),
      trailing: Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _savedWordPairs.remove(pair);
          } else {
            _savedWordPairs.add(pair);
          }
        });
        _setSavedWordPairs();
      },
    );
  }

  void _pushSaved() {
    Navigator.of(context)
        .push(MaterialPageRoute(builder: (BuildContext context) {
      final Iterable<ListTile> tiles = _savedWordPairs.map((WordPair pair) {
        return ListTile(
            title: Text(pair.asPascalCase, style: TextStyle(fontSize: 16.0)));
      });

      final List<Widget> divided =
          ListTile.divideTiles(context: context, tiles: tiles).toList();

      return Scaffold(
        appBar: AppBar(
          title: Text("Saved WordPairs"),
        ),
        body: ListView(
          children: divided,
        ),
      );
    }));
  }

  @override
  void initState() {
    super.initState();
    _getSavedWordPairs();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("WordPair Generator"),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.list),
              onPressed: _pushSaved,
            )
          ],
        ),
        body: _buildList());
  }
}

导入“包装:颤振/材料.省道”; 导入“包:英语单词/英语单词.dart”; 导入“package:shared_preferences/shared_preferences.dart”; 导入“dart:convert”; 类RandomWords扩展了StatefulWidget{ @凌驾 RandomWordsState createState()=>RandomWordsState(); } 类RandomWordsState扩展状态{ 最终_randomWordPairs=[]; final _savedWordPairs=Set(); Future _setSavedWordPairs()异步{ List savedWordPairsList=_savedWordPairs.toList(); SharedReferences prefs=等待SharedReferences.getInstance(); wait prefs.setString(“字对”,JSONECODE(savedWordPairsList)); 打印(prefs.getString(“字对”); } Future\u getSavedWordPairs()异步{ SharedReferences prefs=等待SharedReferences.getInstance(); 字符串savedWordPairsString= prefs.getString(“字对”)??JSONECODE([]); List savedWordPairsList=jsonDecode(savedWordPairsString); 打印(保存或配对列表); 设置状态(){ _addAll(savedWordPairsList); _savedWordPairs.addAll(savedWordPairsList); }); } 小部件_buildList(){ 返回ListView.builder( 填充:常数边集全部(16.0), itemBuilder:(上下文,项){ if(item.isOdd)返回分隔符(); 最终索引=项目~/2; 如果(索引>=\u randomWordPairs.length){ _addAll(generateWordPairs().take(10)); } 返回_buildRow(_randomWordPairs[index]); }, ); } 小部件构建行(字对){ final alreadySaved=\u savedWordPairs.contains(pair); 返回列表块( 标题:Text(pair.asPascalCase,style:TextStyle(fontSize:18.0)), 尾随:图标( alreadySaved?Icons.favorite:Icons.favorite_边框, 颜色:已保存?颜色。红色:空, ), onTap:(){ 设置状态(){ 如果(已保存){ _savedWordPairs.remove(对); }否则{ _savedWordPairs.add(pair); } }); _setSavedWordPairs(); }, ); } 作废(){ 导航器(上下文) .push(MaterialPage路由(生成器:(构建上下文){ final Iterable tiles=\u savedWordPairs.map((字对){ 返回列表块( 标题:Text(pair.asPascalCase,style:TextStyle(fontSize:16.0)); }); 最后的名单有分歧= divideTiles(上下文:context,tiles:tiles.toList(); 返回脚手架( appBar:appBar( 标题:文本(“保存的字对”), ), 正文:ListView( 儿童:分裂, ), ); })); } @凌驾 void initState(){ super.initState(); _getSavedWordPairs(); } @凌驾 小部件构建(构建上下文){ 返回脚手架( appBar:appBar( 标题:文本(“字对生成器”), 行动:[ 图标按钮( 图标:图标(Icons.list), 按下按钮:\u已保存, ) ], ), 正文:_buildList()); } }
您可以复制粘贴运行下面的完整代码
您需要扩展
WordPair
并添加
toJson()
fromJson()

代码片段

List<WordPairExt> wordPairExtFromJson(String str) => 
List<WordPairExt>.from(json.decode(str).map((x) => WordPairExt.fromJson(x)));

String wordPairExtToJson(List<WordPairExt> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class WordPairExt extends WordPair {
  String first;
  String second;

  WordPairExt({
    this.first,
    this.second,
  }) : super(first, second);

  factory WordPairExt.fromJson(Map<String, dynamic> json) => WordPairExt(
        first: json["first"],
        second: json["second"],
      );

  Map<String, dynamic> toJson() => {
        "first": first,
        "second": second,
      };
}
List wordPairExtFromJson(字符串str)=>
from(json.decode(str.map)((x)=>WordPairExt.fromJson(x));
字符串wordpairextotojson(List data)=>json.encode(List.from(data.map((x)=>x.toJson()));
类WordPairExt扩展了WordPair{
先串;
弦秒;
WordPairExt({
这,首先,,
这一秒,
}):超级(第一、第二);
工厂WordPairExt.fromJson(映射json)=>WordPairExt(
first:json[“first”],
第二个:json[“第二个”],
);
映射到JSON()=>{
“第一”:第一,
"二":二,,
};
}
工作演示

完整代码

import 'package:flutter/material.dart';
import "package:english_words/english_words.dart";
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

List<WordPairExt> wordPairExtFromJson(String str) => List<WordPairExt>.from(json.decode(str).map((x) => WordPairExt.fromJson(x)));

String wordPairExtToJson(List<WordPairExt> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class WordPairExt extends WordPair {
  String first;
  String second;

  WordPairExt({
    this.first,
    this.second,
  }) : super(first, second);

  factory WordPairExt.fromJson(Map<String, dynamic> json) => WordPairExt(
        first: json["first"],
        second: json["second"],
      );

  Map<String, dynamic> toJson() => {
        "first": first,
        "second": second,
      };
}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  final _randomWordPairs = <WordPairExt>[];
  final _savedWordPairs = Set<WordPairExt>();

  Future<void> _setSavedWordPairs() async {
    List<WordPairExt> savedWordPairsList = _savedWordPairs.toList();
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString("wordpairs", wordPairExtToJson(savedWordPairsList));
    print(prefs.getString("wordpairs"));
  }

  Future<void> _getSavedWordPairs() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String savedWordPairsString = prefs.getString("wordpairs");
    if (savedWordPairsString != null ) {
      List<WordPairExt> savedWordPairsList = wordPairExtFromJson(
          savedWordPairsString);
      print(savedWordPairsList);
      setState(() {
        _randomWordPairs.addAll(savedWordPairsList);
        _savedWordPairs.addAll(savedWordPairsList);
      });
    }
  }

  Widget _buildList() {
    return ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (context, item) {
        if (item.isOdd) return Divider();

        final index = item ~/ 2;

        if (index >= _randomWordPairs.length) {
          generateWordPairs().take(10).forEach((wp) {
            _randomWordPairs
                .add(WordPairExt(first: wp.first, second: wp.second));
          });
          //_randomWordPairs.addAll(generateWordPairs().take(10).cast());
        }

        return _buildRow(_randomWordPairs[index]);
      },
    );
  }

  Widget _buildRow(WordPair pair) {
    final alreadySaved = _savedWordPairs.contains(pair);

    return ListTile(
      title: Text(pair.asPascalCase, style: TextStyle(fontSize: 18.0)),
      trailing: Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _savedWordPairs.remove(pair);
          } else {
            _savedWordPairs.add(pair);
          }
        });
        _setSavedWordPairs();
      },
    );
  }

  void _pushSaved() {
    Navigator.of(context)
        .push(MaterialPageRoute(builder: (BuildContext context) {
      final Iterable<ListTile> tiles = _savedWordPairs.map((WordPair pair) {
        return ListTile(
            title: Text(pair.asPascalCase, style: TextStyle(fontSize: 16.0)));
      });

      final List<Widget> divided =
          ListTile.divideTiles(context: context, tiles: tiles).toList();

      return Scaffold(
        appBar: AppBar(
          title: Text("Saved WordPairs"),
        ),
        body: ListView(
          children: divided,
        ),
      );
    }));
  }

  @override
  void initState() {
    super.initState();
    _getSavedWordPairs();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("WordPair Generator"),
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.list),
              onPressed: _pushSaved,
            )
          ],
        ),
        body: _buildList());
  }
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: RandomWords(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:英语单词/英语单词.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“dart:convert”;
List wordPairExtFromJson(String str)=>List.from(json.decode(str.map)(x)=>wordPairExtFromJson(x));
字符串wordpairextotojson(List data)=>json.encode(List.from(data.map((x)=>x.toJson()));
类WordPairExt扩展了WordPair{
先串;
弦秒;
WordPairExt({
这,首先,,
这一秒,
}):超级(第一、第二);
工厂WordPairExt.fromJson(映射json)=>WordPairExt(
first:json[“first”],
第二个:json[“第二个”],
);
映射到JSON()=>{
“第一”:第一,
"二":二,,
};
}
类RandomWords扩展了StatefulWidget{
@凌驾
RandomWordsState createState()=>RandomWordsState();
}
类RandomWordsState扩展状态{
最终_randomWordPairs=[];
final _savedWordPairs=Set();
Future _setSavedWordPairs()异步{
List savedWordPairsList=_savedWordPairs.toList();
SharedReferences prefs=等待SharedReferences.getInstance();
等待prefs.setString(“字对”,wordPairExtToJson(savedWordPairsList));
打印(prefs.getString(“字对”);
}
Future\u getSavedWordPairs()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
字符串savedWordPairsString=