gpt4 book ai didi

flutter - StatelessWidget中的构建函数不断刷新

转载 作者:行者123 更新时间:2023-12-03 04:01:08 24 4
gpt4 key购买 nike

考虑以下StatelessWidget:

class SwitchScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final testService = Provider.of<TestService>(context); // Line 1
Future( () {
Navigator.of(context).push( // Segment 2
MaterialPageRoute(builder: (context) => TestScreen()) // Segment 2
); // Segment 2
});

return Scaffold(body: Center( child: Text("lol") ) );
}
}

小部件位于小部件树的根目录的正下方,并用 ChangeNotifierProvider包装:
void main() => runApp(new Main());

class Main extends StatefulWidget {
_MainState createState() => _MainState();
}

class _MainState extends State<Main> {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SampleProgram',
home: ChangeNotifierProvider<TestService>(
builder: (_) { return TestService(); } ,
child: SwitchScreen(),
),
);
}
}

与提供者关联的服务 TestService当前为空。 TestScreen只是另一个 StatelessWidget,其中包括包裹在 AppBar中的 Scaffold

我希望程序可以完成 SwitchScreen的呈现,导航到 TestScreen以实现 future ,并最终在 AppBar内呈现 TestScreen。但是,每次进入 TestScreen View 时,似乎都会触发 SwitchScreen的重建。然后,该应用弹回 SwitchScreen,移至 TestScreen以实现 future ,并重复此过程。通过使用debug Print语句,我确定 build完成渲染后立即调用 SwitchScreenTestScreen方法。

有趣的是,如果我注释掉第1行,则不会重新触发 build方法。类似地,如果我用其他任何内容替换了段2的全部内容,例如一条打印语句,那么 build方法也不会继续触发。我怀疑 Navigator会导致 TestService中的某些值更改,从而迫使 SwitchScreen重建,因此我覆盖了 notifyListeners中的 TestService方法,因为该方法是 SwitchScreen可以影响 TestService的唯一方法。
class TestService with ChangeNotifier {
@override
void notifyListeners() {
print("Triggering SwitchScreen's build method");
}
}

但是没有打印出字符串。现在,我对重新构建的原因以及提供商和导航器在其中扮演的角色非常好奇。任何帮助将非常感激。

最佳答案

而不是打电话

final testService = Provider.of<TestService>(context);

使用
final testService = Provider.of<TestService>(context, listen: false);

在build方法中使用上述命令行不会导致在调用notifyListeners时重新构建此小部件。

关于flutter - StatelessWidget中的构建函数不断刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com