将数据从firebase序列化为Flutter的Dart对象的最佳方法是什么?
发布时间:2020-12-14 14:56:01 所属栏目:百科 来源:网络整理
导读:从firebase序列化数据列表的最佳方法是什么? Firebase为对象提供了列表的属性列表,这使得提出良好的转换技术更具挑战性. 你如何从firebase序列化这些数据?: { "-KiRg_F-qC59xxlfZ6ej": { "first":"Brandon","last":"Donnelson" },"-KiRgmsISBsJSWfXhrdD":
从firebase序列化数据列表的最佳方法是什么? Firebase为对象提供了列表的属性列表,这使得提出良好的转换技术更具挑战性.
你如何从firebase序列化这些数据?: { "-KiRg_F-qC59xxlfZ6ej": { "first":"Brandon","last":"Donnelson" },"-KiRgmsISBsJSWfXhrdD": { "first":"Danny","last":"Kirk" } } 我想出了什么:(见_loadData()) import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo',theme: new ThemeData( primarySwatch: Colors.blue,),home: new MyHomePage(title: 'Flutter Demo Home Page'),); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key,this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title),body: new Center( child: new Text( 'click',floatingActionButton: new FloatingActionButton( onPressed: _test,tooltip: 'Increment',child: new Icon(Icons.add),); } void _test() { _loadData(); } _loadData() async { String url = 'https://dev-xxxxxxx.firebaseio.com/names.json'; var httpClient = createHttpClient(); var response = await httpClient.read(url); print('response=' + response); // response={"-KiRg_F-qC59xxlfZ6ej":{"first":"Brandon","last":"Donnelson"},"-KiRgmsISBsJSWfXhrdD":{"first":"Danny","last":"Kirk"}} NamesData namesData = new NamesData(JSON.decode(response)); print("names.len=" + namesData.names.length.toString()); } } class NamesData { final List<NameData> names = new List(); NamesData(Map data) { data.values.forEach((Map map) => names.add(new NameData.fromJson(map))); } } class NameData { String first; String last; NameData.fromJson(Map map) { first = map['first']; last = map['last']; } } 我发现json解码器有一个更好的方法来使用reviver函数实例化类.这感觉好多了,但我想我可以做得更好. _loadData() async { String url = 'https://dev-xxxxxxx.firebaseio.com/names.json'; var httpClient = createHttpClient(); var response = await httpClient.read(url); print('response=' + response); // response={"-KiRg_F-qC59xxlfZ6ej":{"first":"Brandon","last":"Kirk"}} var extendedJson = new JsonCodec(reviver: _reviver); var o = extendedJson.decode(response); print('end'); } // https://github.com/dart-lang/sdk/blob/master/tests/lib/convert/json_toEncodable_reviver_test.dart _reviver(key,value) { if (value != null && value is Map && key.toString().contains("-")) { return new NameData2(value); } return value; } } class NameData2 { String first; String last; NameData2(Map map) { first = map['first']; last = map['last']; } } 解决方法
我个人喜欢有时写一个小编解码器:
DartPad example import 'dart:convert'; void main() { final decoder = const FirebaseNamesDecoder(); print(decoder.convert(exampleFirebaseData)); } class NamedData { final String id; final String firstName; final String lastName; const NamedData(this.id,this.firstName,this.lastName); @override String toString() => '$NamedData {$id: $firstName $lastName}'; } class FirebaseNamesDecoder extends Converter<Map,Iterable<NamedData>> { const FirebaseNamesDecoder(); @override Iterable<NamedData> convert(Map<String,Map> raw) { return raw.keys.map((id) => new NamedData(id,raw[id]['first'],raw[id]['last'])); } } final exampleFirebaseData = { "-KiRg_F-qC59xxlfZ6ej": { "first":"Brandon","last":"Donnelson" },"last":"Kirk" } }; 结果是:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – TextBlock.GetBindingExpression返回NULL
- swift – 如何设置Xcode游戏以稳定的方式使用构建的框架?
- ruby-on-rails – 连接到S3时获取“SSL_connect返回= 1 err
- c – 是否可以定义构造函数的函数指针?
- 正则表达式 汇总2
- C++ sort(STL sort)排序算法详解
- get_release Oracle API返回“未知”结果而不是正确的版本
- 编写C#客户端以使用返回数组对象的Java Web服务
- React Native 简单的组件
- c# – HttpUtility.ParseQueryString()总是将特殊字符编码为