当前位置: 首页 > 知识库问答 >
问题:

如何从firebase实时数据库中解析对象列表

逄征
2023-03-14

我一直在努力解决这个问题,无法使用以下代码解析firebase实时数据库中的数据。我什么都试过了,但我做不到。下面是必要文件的代码。我正在使用提供程序进行状态管理。

我的供应商代码:

class StockProvider with ChangeNotifier {
  List<ChartHistoricalData> _histChartData = [];
  List<ChartHistoricalData> get histChartData => _histChartData;

  Future<void> fetchHistoricalStockData(ref) async {
    ref.once().then((DataSnapshot data) {
      print(data.value['SBIN_Historical']);
      _histChartData = List<ChartHistoricalData>.from(data
          .value['SBIN_Historical']
          .map((x) => ChartHistoricalData.fromJson(x as Map<String, dynamic>)));
    notifyListeners();
    });
  }
}

我调用的小部件:

class _SBINChartState extends State<SBINChart> {
  final fb = FirebaseDatabase.instance;
  @override
  Widget build(BuildContext context) {
    final ref = fb.reference();
    context.read<StockProvider>().fetchHistoricalStockData(ref);
    ...

我的模型课:

class ChartHistoricalData {
  DateTime? x; //DateTime
  double? open;
  double? high;
  double? low;
  double? close;

  ChartHistoricalData(
      {required this.x,
      required this.open,
      required this.high,
      required this.low,
      required this.close});

  ChartHistoricalData.fromJson(Map<String, dynamic> json) {
    x = DateTime.parse(json['date']);
    open = json['open'];
    high = json['high'];
    low = json['low'];
    close = json['close'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['date'] = this.x;
    data['open'] = this.open;
    data['high'] = this.high;
    data['low'] = this.low;
    data['close'] = this.close;
    return data;
  }
}

我得到以下错误:

Reloaded 1 of 620 libraries in 1,111ms.
I/flutter (32700): [{date: 2021-01-01, high: 280.0, low: 274.4, close: 279.4, open: 274.9}, {date: 2021-01-04, high: 283.9, low: 277.75, close: 281.05, open: 281.85}, {date: 2021-01-05, high: 282.45, low: 277.0, close: 281.75, open: 278.05}, {date: 2021-01-06, high: 289.15, low: 281.4, close: 285.05, open: 283.0}, {date: 2021-01-07, high: 291.8, low: 287.0, close: 287.7, open: 289.0}, {date: 2021-01-08, high: 291.4, low: 285.2, close: 286.0, open: 290.1}, {date: 2021-01-11, high: 288.2, low: 279.6, close: 282.5, open: 288.0}, {date: 2021-01-12, high: 293.85, low: 277.9, close: 292.5, open: 280.0}, {date: 2021-01-13, high: 308.0, low: 294.5, close: 306.8, open: 296.0}, {date: 2021-01-14, high: 309.25, low: 303.8, close: 307.25, open: 306.7}, {date: 2021-01-15, high: 310.9, low: 301.3, close: 303.85, open: 306.8}, {date: 2021-01-18, high: 308.65, low: 292.2, close: 294.45, open: 303.5}, {date: 2021-01-19, high: 302.5, low: 296.4, close: 298.6, open: 297.65}, {date: 2021-01-20, high: 304.7, low: 296.85, close: 302.55, open: 298.8
E/flutter (32700): [ERROR:flutter/shell/common/shell.cc(103)] Dart Unhandled Exception: type '_InternalLinkedHashMap<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>' in type cast, stack trace: #0      StockProvider.fetchHistoricalStockData.<anonymous closure>.<anonymous closure>
package:algoguru/providers/stock_provider.dart:15
E/flutter (32700): #1      MappedListIterable.elementAt (dart:_internal/iterable.dart:412:31)
E/flutter (32700): #2      ListIterator.moveNext (dart:_internal/iterable.dart:341:26)
E/flutter (32700): #3      new List.from (dart:core-patch/array_patch.dart:40:17)
E/flutter (32700): #4      StockProvider.fetchHistoricalStockData.<anonymous closure>
package:algoguru/providers/stock_provider.dart:13
E/flutter (32700): <asynchronous suspension>
E/flutter (32700): #5      StockProvider.fetchHistoricalStockData
package:algoguru/providers/stock_provider.dart:11
E/flutter (32700): <asynchronous suspension>
E/flutter (32700):

如果有人能帮忙,我将非常感激,它已经调试了很长时间...

共有3个答案

滑令
2023-03-14

好吧,最后!这不是一个很好的解决方案,但对我来说确实有效。我不知道,也不确定firebase_数据库返回给我们的数据类型,但通过先对快照实例数据进行json编码,然后对其进行json解码,解决了数据类型问题。守则:

Future<void> fetchHistoricalStockData(ref) async {
    return ref.once().then((DataSnapshot data) {
      final cleanup = jsonDecode(jsonEncode(data.value)); // THIS IS THE ANSWER
      _histChartData = List<ChartHistoricalData>.from(cleanup['SBIN_Historical']
          .map((x) => ChartHistoricalData.fromJson(x as Map<String, dynamic>)));
      notifyListeners();
    });
  }
伯君浩
2023-03-14

问题:问题出现在名为fetchHistoricalStockData(ref)的方法中,当您调用ref.once()时,这是一个异步方法,需要一些时间才能执行,您正在等待该方法,但也提供了。然后(数据)回调,所以问题是当方法ref.once()完成时,中的代码会被调用。然后(dataref.once()之后的代码一起开始执行,因此在解析数据之前调用notifynotifyListeners()。

解决方案:将notifyListeners()的调用移动到内部。然后(数据)在完全解析数据后回调,然后删除ref.once()之前的wait,因为不需要它(然后(数据)回调正在做相同的工作),并将其替换为return以直接返回ref.once()的功能,并在中执行wait调用该方法的位置。

我希望它能起作用,祝你好运。

冯枫
2023-03-14

您可以将data.value转换为Map

dart prettyprint-override">Future<void> fetchHistoricalStockData(ref) async {
    ref.once().then((DataSnapshot data) {
    Map<String, dynamic> dataValue = data.value as Map<String, dynamic>;

      _histChartData = List<ChartHistoricalData>.from(dataValue['SBIN_Historical']
          .map((x) => ChartHistoricalData.fromJson(x as Map<String, dynamic>)));
    notifyListeners();
    });
  }

 类似资料:
  • 我需要一些与Firebase实时数据库请求的帮助。 我想实现一些类似搜索屏幕,将显示所有用户,但我有一个问题,从Firebase检索数据。 下面是向Firebase发送请求的方法。 和检索用户计数。 有人能解释我该怎么办?

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 我如何删除记录“苹果”(在图片中标记)? 根据文档,要移除一个项,需要对引用调用removeValue()。但要获得引用,我需要子ID。因为它是一个随机生成的id(-kisnx87ayigsh3ilp0d),如何删除它?

  • 问题内容: 我正在使用golang,并且尝试从mysql读取时间,并且遇到以下错误。 我得到的错误是 我怎样才能解决这个问题? 问题答案: 假设您正在使用,则可以通过添加到连接字符串中来要求驱动程序将DATE和DATETIME自动扫描到。 参见https://github.com/go-sql-driver/mysql#timetime- support 示例代码: 请注意,这适用于,但不适用于。

  • firebase数据库最近的更新似乎有一些变化。我的项目在firebase\u数据库:^7.0.0版本下运行良好,但在firebase数据库的更新版本中,我无法更新项目代码。 以下是v7的工作版本 firebase\u数据库^9.0.12上的同一代码出现错误。我收到的错误在`(DataSnapShot snap)async{…}上错误是 无法将参数类型“Future Function(DataSn

  • 这是我的firebase聊天结构(见下图)。我只想获得amitpal_name值,而不是其他值,而是这个方法来获取所有值 我也使用了这个 DBreference=FireBaseDatabase.GetInstance().GetReference(“ChatMessage”).Child(“Msg”).Child(“AmitPal_Name”); 我也尝试了下面这个方法,给了我很好的预期的效果,