将Json数组转换为List< Object>在Flutter [英] Convert Json Array to List<Object> in Flutter

查看:233
本文介绍了将Json数组转换为List< Object>在Flutter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Flutter和Dart的新手,我一直在努力将值保存在共享首选项中,以便在我的应用程序重新启动时使用.我已经成功存储了变量,但是我还需要存储对象列表.我知道,由于共享首选项仅接受字符串列表,因此我需要将对象列表转换为JSON数组,并且在应用程序重新启动时,检索此列表并将其再次转换为对象列表.

I'm new to Flutter and Dart and I have been struggling with saving values in shared preferences to use when my app is restarted. I have successfully stored variables, but I also need object lists to be stored. I know that since shared preferences only accept String lists, I need to convert my object list into a JSON array and when the app is restarted, retrieve this list and convert it to an object list again.

我能够将对象列表编码为JSON,我得到了类似的东西:

I was able to encode the object list to JSON and I got something like this:

[{name: Rent, amount: 250}, {name: Insurance, amount: 105}]

我通过以下功能实现了这一点:

I achieved this with the following function:

  void SaveLists(key, value) async { //where value is a List<Object>
    final prefs = await SharedPreferences.getInstance();
    List<dynamic> json_list = (value.map((i) => i.toJson())).toList();
    prefs.setStringList(key, json_list); //this line causes the error
    print('$json_list');
  }

列表json_list包含上面显示的JSON数组.但是,当我尝试使用prefs.setStringList(key, json_list);将其存储在共享首选项中时,出现以下错误:

The List json_list contains the JSON array that is shown above. However when I try to store it in the shared preferences with prefs.setStringList(key, json_list); I get the following error:

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<String>'

现在,假设我以某种方式成功地将其存储在共享首选项中,用prefs.getString('key')调用时如何将JSON数组转换回List?

Now, let's say that I somehow store it successfully in shared preferences, how do I convert the JSON array back to a List when called with prefs.getString('key')?

如果您需要看课,这里是:

In case you need to see the class, here it is:

import 'dart:convert';
class Random_expenses {

 String name;
 double amount;

 Random_expenses({this.name, this.amount});

 Random_expenses.fromJson(Map<String, dynamic> json)
     : this.name = json['name'],
       this.amount = json['amount'];

 Map<String, dynamic> toJson() =>
     {'name': this.name, 'amount': this.amount};
}

推荐答案

您可以在
下复制粘贴运行完整代码 您可以使用randomExpensesToJson(value)
List<RandomExpenses>另存为json字符串. 您可以通过randomExpensesFromJson(keyString)

You can copy paste run full code below
You can save List<RandomExpenses> as a json string with randomExpensesToJson(value)
You can get List<RandomExpenses> with randomExpensesFromJson(keyString)

代码段

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

String randomExpensesToJson(List<RandomExpenses> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
...
void saveData(String key, List<RandomExpenses> value) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setString(key, randomExpensesToJson(value));
  }

Future<List<RandomExpenses>> getData(String key) async {
  final prefs = await SharedPreferences.getInstance();
  String keyString = prefs.getString(key);
  return Future.value(randomExpensesFromJson(keyString));
}
...
await saveData("key", randomExpensesList);
List<RandomExpenses> list = await getData("key");

print('${list[0].name} ${list[0].amount}');
print('${list[1].name} ${list[1].amount}');

输出

I/flutter (24879): Rent 250
I/flutter (24879): Insurance 105

完整代码

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

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

String randomExpensesToJson(List<RandomExpenses> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class RandomExpenses {
  String name;
  int amount;

  RandomExpenses({
    this.name,
    this.amount,
  });

  factory RandomExpenses.fromJson(Map<String, dynamic> json) => RandomExpenses(
        name: json["name"],
        amount: json["amount"],
      );

  Map<String, dynamic> toJson() => {
        "name": name,
        "amount": amount,
      };
}

void main() {
  runApp(MyApp());
}

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

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;
  List<RandomExpenses> randomExpensesList = [
    RandomExpenses(name: "Rent", amount: 250),
    RandomExpenses(name: "Insurance", amount: 105)
  ];

  void saveData(String key, List<RandomExpenses> value) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setString(key, randomExpensesToJson(value));
  }

  Future<List<RandomExpenses>> getData(String key) async {
    final prefs = await SharedPreferences.getInstance();
    String keyString = prefs.getString(key);
    return Future.value(randomExpensesFromJson(keyString));
  }

  void _incrementCounter() async {
    await saveData("key", randomExpensesList);
    List<RandomExpenses> list = await getData("key");

    print('${list[0].name} ${list[0].amount}');
    print('${list[1].name} ${list[1].amount}');

    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.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

这篇关于将Json数组转换为List&lt; Object&gt;在Flutter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆