Как исправить «.map.tolist (), возвращающий экземпляр вместо списка» при анализе списка карт во Flutter? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь прочитать базу данных Firebase в реальном времени и пытаюсь преобразовать ее в список, чтобы я мог представить ее в виде виджета таблицы в моем приложении.

Вот данные Json, которые я импортирую в базу данных реального времени firebase, а затем вызываю их в моем приложении

[
    {
        "SYMBOL": "VOLTAS",
        "OPEN": "572.8",
        "CLOSE": "572.2",
        "FORECAST": "TRENDING"
    },
    {
        "SYMBOL": "GODREJCP",
        "OPEN": "645.05",
        "CLOSE": "640.55",
        "FORECAST": "TRENDING"
    },
    {
        "SYMBOL": "MARICO",
        "OPEN": "355.4",
        "CLOSE": "351.4",
        "FORECAST": "TRENDING"
    },
    {
        "SYMBOL": "KOTAKBANK",
        "OPEN": "1396.0",
        "CLOSE": "1389.35",
        "FORECAST": "TRENDING"
    },
    {
        "SYMBOL": "KAJARIACER",
        "OPEN": "575.0",
        "CLOSE": "579.95",
        "FORECAST": "TRENDING"
    }
]

Я искал часы и часы и наконец нашел это руководство: https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

Я наконец понял, что имею дело со списком карт.

Ниже мой текущий набор кода. cprdata.dart:

class MyDataList {
  final List<MyData> myList ;

  MyDataList({
    this.myList,
  });

  factory MyDataList.fromJson(List<dynamic> parsedJson) {

    List<MyData> myList = new List<MyData>();
    myList = parsedJson.map((i)=> MyData.fromJson(i)).toList();

    return new MyDataList(
        myList: myList
    );
  }
}




class MyData {
  final String SYMBOL;
  final String FORECAST;
  final String OPEN;
  final String CLOSE;

  MyData({
    this.SYMBOL,
    this.OPEN,
    this.CLOSE,
    this.FORECAST});

  factory MyData.fromJson(Map<String, dynamic> json){
    //print(json);
    return new MyData(
      SYMBOL: json['SYMBOL'],
      OPEN: json['OPEN'],
      CLOSE: json['CLOSE'],
      FORECAST: json['FORECAST']
    );
  }

}

cpr.dart

///import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'cprdata.dart';
import 'dart:convert';


class CprAnalysis extends StatefulWidget{
  @override
  CPRState createState() => CPRState();
}

class CPRState extends State<CprAnalysis> {

  List<MyData> allData = [];

  @override
  void initState() {
    super.initState();
    DatabaseReference cprData = FirebaseDatabase.instance.reference();

    cprData.reference().once().then((DataSnapshot snap) {
      var d = snap.value;
      final jsonE = json.encode(d);
      final jsonResponse = json.decode(jsonE);
      MyDataList zz = new MyDataList.fromJson(jsonResponse);
      print(zz.myList);

      setState(() {
        print("Done");
        //print('Length : ${allData.length}');
      });
    }
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("CPR Analysis"),

      ),
    );
  }

Ожидаемый результат - список, содержащий данные файла json в формате списка, так что я могу использовать его для создания таблицы для отображения в моем приложении.

Фактический результат:

I/flutter (16067): [Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance of 'MyData', Instance o
I/flutter (16067): Done

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вы можете заставить его печатать, что хотите, переопределив toString() в MyData классе:

class MyData {
  ...

  // Add this
  @override
  String toString() {
    return 'Symbol: $SYMBOL, Open: $OPEN, Close: $CLOSE, Forecast: $FORECAST';
  }
}
0 голосов
/ 14 мая 2019

Вы просите, чтобы Дарт распечатал содержимое zz, который является списком экземпляров MyData - так что он делает правильные вещи. Если вы хотите, чтобы данные, содержащиеся в списке, работали примерно так:

zz.forEach((data) => print(
      "Row contains ${data.SYMBOL} - ${data.FORECAST} - ${data.OPEN} - ${data.CLOSE}"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...