将数据从firebase序列化为Flutter的Dart对象的最佳方法是什么?

将数据从firebase序列化为Flutter的Dart对象的最佳方法是什么?,第1张

概述从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"  }};

结果是:

( namedData {-KiRg_F-qC59xxlfZ6ej: Brandon Donnelson},namedData {-KiRgmsISBsJsWfXhrdD: Danny Kirk} )

总结

以上是内存溢出为你收集整理的将数据从firebase序列化为Flutter的Dart对象的最佳方法是什么?全部内容,希望文章能够帮你解决将数据从firebase序列化为Flutter的Dart对象的最佳方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1003442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存