2017-04-24 3 views
4

firebaseからのデータのリストをシリアル化する最良の方法は何ですか? Firebaseは、オブジェクトにリストのプロパティのリストを提供します。これにより、優れた変換手法を思いつくのは難しくなります。あなたは私が思い付いた何firebase?:FirebaseのデータをFlutterのDartオブジェクトにシリアル化する最も良い方法は何ですか?

{ 
    "-KiRg_F-qC59xxlfZ6ej": { 
    "first":"Brandon", 
    "last":"Donnelson" 
    }, 
    "-KiRgmsISBsJSWfXhrdD": { 
    "first":"Danny", 
    "last":"Kirk" 
    } 
    } 

からこのデータをシリアル化する方法を

:JSONのデコーダがあり

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']; 
    } 

} 

私が見つけた(_loadDataは()を参照してください) 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":"Donnelson"},"-KiRgmsISBsJSWfXhrdD":{"first":"Danny","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']; 
    } 
    } 
+0

リビバーを使用すると、jsonからの解読に最適な方法のようです。 – Branflake2267

答えて

1

I個人時々小さなCodecを書き込むように:

( NamedData:で

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" 
    }, 
    "-KiRgmsISBsJSWfXhrdD": { 
    "first":"Danny", 
    "last":"Kirk" 
    } 
}; 

結果{-KiRg_F-qC59xxlfZ6ej:ブランドンドン・ネルソン} NamedData {-KiRgmsISBsJSWfXhrdD:Dann y Kirk}

+0

DartPadの共有に問題が発生しました。空です。 –

+0

コンバータの使用は素晴らしいです! – Branflake2267

関連する問題