加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将数据从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"
  }
};

结果是:

( NamedData {-KiRg_F-qC59xxlfZ6ej: Brandon Donnelson},NamedData {-KiRgmsISBsJSWfXhrdD: Danny Kirk} )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读