1

我正在尝试创建一个有按钮的应用程序,当用户单击该按钮时,会记录当天的时间戳并将其上传到 Firestore。然后我从那里获取数据并更新一个 fl 图表小部件。

这就是我从 firebase 获取数据、将其转换为 DateTime 并将其发送到图形构建方法的方式。

Future<void> updateOfflineGraph(String uid) async {
    //GraphData graphData = globalContext.watch<GraphData>();
    GraphData graphData = GraphData();
    List<dynamic> today = List<dynamic>();
    List<DateTime> now = List<DateTime>();
    try {
      DocumentSnapshot _docSnapshot =
          await _firestore.collection("graph").document(uid).get();
      today.addAll(_docSnapshot.data()['dates']);

      for (int i = 0; i < today.length; i++) {
        now.add(DateTime.fromMicrosecondsSinceEpoch(
            today[i].microsecondsSinceEpoch));
      }
      graphData.buildGraph(now);
    } catch (e) {
      print(e);
    }
  } 

这就是我处理 fl 图表数据的方式。

class GraphData with ChangeNotifier {
  List<FlSpot> _data = List<FlSpot>();
  List<int> _date = List<int>();

  List<FlSpot> get data =>
      List.unmodifiable(_data..sort((a, b) => a.x.compareTo(b.x)));

  void addPoint(FlSpot spot) {
    _data.add(spot);
    notifyListeners();
  }

  void buildGraph(List<DateTime> dateTime) {
    removeAllPoints();

    int days = 0;
    int month = dateTime[0].month;
    for (int i = 0; i < dateTime.length; i++) {
      if (dateTime[i].month == month) {
        days++;
      } else {
        addMonth(days, month);
        days = 0;
        month = dateTime[i].month;
        i--;
      }
    }
    addMonth(days, month);
  }

  void addMonth(int days, int month) {
    addPoint(FlSpot(month.toDouble(), days.toDouble()));
    print(days);
    print(month);
    print(_data.length);
  }
}

然后执行此操作以更新图表。

LineChartBarData(
                  spots:
                      // [
                      //   FlSpot(1, 3),
                      //   FlSpot(2, 4),
                      //   FlSpot(4, 5.5),
                      //   FlSpot(5, 1),
                      //   FlSpot(8, 4),
                      //   FlSpot(12, 3),
                      // ],
                      context.watch<GraphData>().data.length > 0
                          ? context.watch<GraphData>().data
                          : [FlSpot(0.0, 0.0)],
}

我面临的问题是,当我做这整件事时,点成功地存储在 _data 列表中,但是当我尝试调用 LineChartBarData 中的点时,它说 _data 在被调用时为空。我不知道为什么会发生这种情况,因为数据在之前的迭代中就在那里。

4

0 回答 0