【问题标题】:Unable to update Dashboard with data from sql Flutter无法使用来自 sql Flutter 的数据更新仪表板
【发布时间】:2020-10-20 16:58:13
【问题描述】:

我的 Flutter 应用有一个仪表板,其中第一个屏幕是图表。图表的数据来自本地 sql 数据库。我有一个 Future 异步调用来通过数据库提供程序获取数据。

我当前的问题是,在真实设备上,init() 调用不会获取数据,因此不会填充图表。但是,当我导航到另一个屏幕并返回仪表板时,会填充数据。

感谢任何帮助,让我知道可能是什么问题。

下面是我调用函数_getExpTot​​al();的initState代码

class _DashboardPageState extends State<DashboardPage> {

  @override
  void initState() {
    super.initState();
    _seriesLineData = List<charts.Series<Sales, int>>();
    _getExpTotal();
  }

下面是Future异步函数_getExpTot​​al()

  Future<List<Map<String, dynamic>>> _getExpTotal() async {
    final result = await databaseProvider.getCatExpTotal();
    expTotal = result;
    count = result.length;
    print(count);
    _getChartData();
    return result;
  }

  Future<int> _getChartData() async {
    for (int i = 0; i < count; i++) {
      String mon = (expTotal[i]['mon-Year']);
      int exp = (expTotal[i]['TranAmount']);
      mon = mon.substring(0, 2);
      print(int.parse(mon));
      linesalesdata.add(Sales(int.parse(mon), exp));
    }
    _generateData();
  }

最后是 _generateData() 来更新图表:

  _generateData() {
    _seriesLineData.add(charts.Series(
      colorFn: (__, _) => charts.ColorUtil.fromDartColor((Colors.blueGrey)),
      id: 'Expense by Month',
      data: linesalesdata,
      domainFn: (Sales sales, _) => sales.yearval,
      measureFn: (Sales sales, _) => sales.salesval,
      labelAccessorFn: (Sales row, _) => '${row.yearval}',
    ));
  }

【问题讨论】:

    标签: android flutter sqflite


    【解决方案1】:

    我可以看到你正在调用你的 _getExpTot​​al(); initState() 中的函数返回 Map 列表,但您并没有真正使用返回的数据。此外,您不能在 initState() 中使用 await,所以我会说您选择了错误的位置来调用您的 _getExpTot​​al();功能。这里有一些可以帮助你的东西。

    @override
      void initState() {
        super.initState();
        _seriesLineData = List<charts.Series<Sales, int>>();
        _renderGraph();
        //Stop calling _getExpTotal() here.
      }
    

    创建一个函数“renderGraph()”

    void _renderGraph() async {
      List<Map<String,dynamic>> returnedData = await _getExpTotal();
      //Use returned data here however you want.
      setState((){
        
      });
    }
    

    【讨论】:

    • 我已经尝试了上述解决方案,尽管我没有看到直接在 init() 中使用 _getExpTot​​al 与使用 _renderGraph() 之间的区别。因为这两个都是异步/等待功能。如果我错了,请纠正我。我的问题是,当我将设备连接到 Android Studio 时,这两种解决方案都有效,但是当我断开连接并独立运行时,不会调用 init()。还有什么建议吗?
    • init() 在你的 UI 第一次渲染时总是被调用一次,无论如何。 init() 只被调用一次,这就是它被称为 init() 的原因。您的代码显示您没有使用从函数返回的地图列表。此外,您不会在获取数据后调用 setState(() {}) 。调用 setState(() {}) 对于呈现 UI 的新状态很重要。
    猜你喜欢
    • 2021-03-15
    • 2019-12-19
    • 2021-01-22
    • 2012-10-10
    • 2016-12-18
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多