如何在 Flutter 中将数据从一个函数传输到另一个函数?具体这种情况

Posted

技术标签:

【中文标题】如何在 Flutter 中将数据从一个函数传输到另一个函数?具体这种情况【英文标题】:How do I transfer data from one function to another function in Flutter? Specifically this case 【发布时间】: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 不。它在构建之外调用。 【参考方案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 之前。现在它只是给我一个没有任何东西的空白

以上是关于如何在 Flutter 中将数据从一个函数传输到另一个函数?具体这种情况的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Excel 中将特定数据从一个 Excel 工作表传输到另一个工作表?

如何在 Firestore -Flutter 中将所有文档从一个集合复制到另一个集合?

在 Flutter 中将数据从一个屏幕传递到另一个屏幕是 null

在phpMyAdmin中将数据从表自动传输到另一个表

在 Cassandra 中将数据从一个集群传输到另一个集群

在 impala 中将文件从一个表传输到另一个表