将json数据保存在flutter中的收藏夹列表中

问题描述

我正在尝试将我的数据添加到收藏夹列表,但我不知道该怎么做,我只是将其保存在收藏夹列表中,但是当重新启动应用程序时,没有任何想法保存在共享首选项中或类似的东西它

加载json的代码如下

List mydata = List();
  final _savedata = Set<Map>();

  Future<void> getjsondata() async {
    final String response = await rootBundle.loadString('assets/data.json');
    final data = await json.decode(response);
    setState(() {
      mydata = data["InfoPlate"];
    });
  }

这个用于将数据添加到收藏夹列表

void _pushSaved() {
    Navigator.of(context).push(
      new MaterialPageRoute<void>(
        builder: (BuildContext context) {
          final Iterable<ListTile> tiles = _savedata.map(
            (Myinfo) {
              return new ListTile(
                title: Text(Myinfo['type']),);
            },);
          final List<Widget> divided = ListTile.divideTiles(
            context: context,tiles: tiles,).toList();
          return new Scaffold(
            appBar: new AppBar(
              title: const Text('Favorited info Plate '),),body: new ListView(children: divided),);
        },);
  }

这是卡片中添加按钮的其余代码

 Widget _buildDataList() {
    return ListView.builder(
        itemCount: mydata.length,padding: const EdgeInsets.all(8.0),itemBuilder: (context,int index) {
          return _buildrowInfo(mydata[index]);
        });
  }

  Widget _buildrowInfo(Map myinfo) {
    final bool favourited = _savedata.contains(myinfo);

    void _favorscreen() {
      setState(() {
        if (favourited) {
          _savedata.remove(myinfo);
        } else {
          _savedata.add(myinfo);
        }
      });
    }

    return Directionality(
      textDirection: TextDirection.rtl,child: Card(
        child: ListTile(
          visualDensity: VisualDensity.comfortable,title: Text(myinfo['type']),trailing: new IconButton(
            icon: Icon(favourited ? Icons.favorite : Icons.favorite_border),color: favourited ? Colors.red : null,onpressed: _favorscreen,);
  }
}

解决方法

可以使用 shared_preferences 在本地存储数据。 您只需要一个 SharedPreferences 实例。

class ExampleWidget extends StatefulWidget {
  @override
  _ExampleWidgetState createState() => _ExampleWidgetState();
}

class _ExampleWidgetState extends State<ExampleWidget> {
  SharedPreferences sharedPreferences;

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration.zero,() async {
      sharedPreferences = await SharedPreferences.getInstance();
    });
  }

然后,为了读取或写入数据,sharedPreferences 是一个键值数据库,并公开了 setter 和 getter。它不允许存储 Set,因此您需要根据您执行的操作对数据负载进行编码和解码。

Future<bool> _writeData(Set<Map> setOfMaps) {
  return sharedPreferences.setString(
    'your_key',jsonEncode(setOfMaps.toList()),);
}

Set<Map> _readData() {
  final encodedData = sharedPreferences.getString('your_key');
  return jsonDecode(encodedData).toSet();
}