Flutter Stateful Widget 仅在构建时运行一次
Flutter Stateful Widget only runs once on build
今天我 运行 我的应用第一次出现这个问题。经过一些测试后,我发现我在 Widget 构建部分调用的方法仅在初始构建或热重载时 运行 一次。以前,这些方法总是 运行ning。例如,如果我在其中一种方法中打印了一个值为 5 的整数,则控制台将显示:
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
等...
现在控制台只打印一次整数(直到我热重载):
I/flutter ( 510): 5
- 即使使用异步方法,它也只会在控制台打印一次。
- 同样的情况也适用于错误消息。
- 它只出现在主页上。
- 这个问题也出现在我的其他应用程序上。
- 我在控制台中 运行 flutter clean。
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel unknown, v1.12.13+hotfix.4, on Microsoft Windows [Version 10.0.18363.778], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.1)
[√] Android Studio (version 3.4)
[√] VS Code (version 1.44.2)
[√] Connected device (1 available)
• No issues found!
我的问题是,我是否首先正确地实现了这样的代码?有没有其他方法我应该这样做,或者 flutter 坏了?
谢谢,感谢您的帮助!
@override
Widget build(BuildContext context) {
// This code only runs once on the inital build
createDay();
getSaveContent();
_updatePointsProgress();
printStuff();
return MaterialApp(
home: Builder(
我不确定我是否误解了你的想法,但如果你的意思是你的函数在第一个构建方法之后被跳过,那么简单是不可能的。像这样。
@override
Widget build(BuildContext context) {
//Some code here runs once
//Some code here is running more often than above code
return MaterialApp(
home: Builder(
这不是正在发生的事情。在您可能发生某些导致重建的事情之前,现在您的小部件没有重建。您的构建函数与任何其他函数一样,它从上到下执行每一行代码。要回答您的问题,您应该在构建方法中实现代码,该代码可以随时 运行 而没有任何负面影响。已经有一个关于保持构建方法清洁的好 Stack 线程,我会 link 它。初始化代码至少应该在构建方法之外,但更理想的是在 initState()
中。如果这不能回答您的问题,请告诉我。
今天我 运行 我的应用第一次出现这个问题。经过一些测试后,我发现我在 Widget 构建部分调用的方法仅在初始构建或热重载时 运行 一次。以前,这些方法总是 运行ning。例如,如果我在其中一种方法中打印了一个值为 5 的整数,则控制台将显示:
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
I/flutter ( 510): 5
等...
现在控制台只打印一次整数(直到我热重载):
I/flutter ( 510): 5
- 即使使用异步方法,它也只会在控制台打印一次。
- 同样的情况也适用于错误消息。
- 它只出现在主页上。
- 这个问题也出现在我的其他应用程序上。
- 我在控制台中 运行 flutter clean。
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel unknown, v1.12.13+hotfix.4, on Microsoft Windows [Version 10.0.18363.778], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.1)
[√] Android Studio (version 3.4)
[√] VS Code (version 1.44.2)
[√] Connected device (1 available)
• No issues found!
我的问题是,我是否首先正确地实现了这样的代码?有没有其他方法我应该这样做,或者 flutter 坏了?
谢谢,感谢您的帮助!
@override
Widget build(BuildContext context) {
// This code only runs once on the inital build
createDay();
getSaveContent();
_updatePointsProgress();
printStuff();
return MaterialApp(
home: Builder(
我不确定我是否误解了你的想法,但如果你的意思是你的函数在第一个构建方法之后被跳过,那么简单是不可能的。像这样。
@override
Widget build(BuildContext context) {
//Some code here runs once
//Some code here is running more often than above code
return MaterialApp(
home: Builder(
这不是正在发生的事情。在您可能发生某些导致重建的事情之前,现在您的小部件没有重建。您的构建函数与任何其他函数一样,它从上到下执行每一行代码。要回答您的问题,您应该在构建方法中实现代码,该代码可以随时 运行 而没有任何负面影响。已经有一个关于保持构建方法清洁的好 Stack 线程,我会 link 它。初始化代码至少应该在构建方法之外,但更理想的是在 initState()
中。如果这不能回答您的问题,请告诉我。