如何在 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 中将所有文档从一个集合复制到另一个集合?