【问题标题】:How do I transfer data from one function to another function in Flutter? Specifically this case如何在 Flutter 中将数据从一个函数传输到另一个函数?具体这种情况
【发布时间】:2021-02-03 11:05:09
【问题描述】:
class GraphPage extends StatefulWidget {

  GraphPage({Key key, this.gender, this.subzone, this.age}) : super(key: key);
  final gender, subzone, age;

  @override
  _GraphPageState createState() => _GraphPageState();
}

class _GraphPageState extends State<GraphPage> {

  int valueData;

  readMe() async {

    ByteData data = await rootBundle.load("assets/Book1.xlsx");
    var bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
    var excel = Excel.decodeBytes(bytes);

    for (var table in excel.tables.keys) {
      print(table);
      print(excel.tables[table].maxCols);
      print(excel.tables[table].maxRows);
      for (var row in excel.tables[table].rows) {
        if (row[3] == widget.subzone) {
          if (row[1] == widget.age) {
            if (row[0] == widget.gender) {
              print(row[4]);
              valueData = row[4];
              print(valueData);
            }
          }
        }
      }
    }
  }

  ...

  _generateData() {
    var barData = [
      new Stats(widget.gender, widget.age, widget.subzone, valueData),
    ];
   
  ...

@override
  void initState() {
    super.initState();
    _seriesData = List<charts.Series<Stats, String>>();
    readMe();
    _generateData();
  }

  @override
  Widget build(BuildContext context) {
...

对于以下条件,我想让 valueData 等于我的 excel 文件的 row[4] 的值。 但是,一旦我将它放入 generateData() 中,它就会返回一个空值。

readMe() 只是一个读取 excel 文件并在某些条件下尝试将值返回给 valueData 的函数。

虽然 generateData() 是一个生成数据并随后绘制图表的函数。

假设 row[0] == "String" 和 row[1] = "String" 和 row[3] = "String" row[4] = 5020,但是当放在 generateData() 函数中时,它返回 null 而不是 5020

谢谢你的建议。

【问题讨论】:

  • 什么时候打电话给_generateData?在build 方法中?
  • @Nitrodon 不。它在构建之外调用。

标签: flutter dart


【解决方案1】:

readMe() 遇到await 关键字时,控制立即返回到initState 方法。这意味着在设置valueData 之前调用_generateData

要等待readMe 完成,您有两种选择。一种是将整个过程包裹在另一个async方法中:

// This method probably needs a better name
Future<void> readAndGenerateData() async {
  await readMe();
  _generateData();
}

@override
void initState() {
  super.initState();
  _seriesData = List<charts.Series<Stats, String>>();
  readAndGenerateData()
}

另一种方法是直接使用Future.then

@override
void initState() {
  super.initState();
  _seriesData = List<charts.Series<Stats, String>>();
  readMe().then((_) => _generateData());
}

如果您在 build 方法中使用来自 _generateData 的信息,请记住调用 setState 以确保使用生成的数据重新构建小部件。

【讨论】:

  • 当我这样做时,我的整个代码都不起作用。在它只是没有传递到 genrateData 函数的变量 valueData 之前。现在它只是给我一个没有任何东西的空白
【解决方案2】:

确保在readMe() 被强制执行后调用_generateData

@override
  void initState() {
    super.initState();
    _seriesData = List<charts.Series<Stats, String>>();
    readMe().then(()=>_generateData());
  }

【讨论】:

  • 当我这样做时,我的整个代码都不起作用。在它只是没有传递到 genrateData 函数的变量 valueData 之前。现在它只是给我一个没有任何东西的空白
猜你喜欢
  • 2017-08-07
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多