gpt4 book ai didi

flutter - 无法将此叠加小部件标记为需要构建,因为框架已经在构建小部件的过程中

转载 作者:IT王子 更新时间:2023-10-29 07:15:10 25 4
gpt4 key购买 nike

我有关注应用:

class MyAppState extends State<MyApp>
{
TenderApiProvider _tenderApiProvider = TenderApiProvider();

Future init() async {
await _tenderApiProvider.getToken();
}
MyAppState()
{
init();
}

@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(builder: (_) => _tenderApiProvider),
],
child: MaterialApp(
title: "My App",
routes: {
'/': (context) => HomePage(),
'/splash-screen': (context) => SplashScreen(),
'/result_table': (context) => ResultDataTable(),
}

),
);
}

}

我需要先绘制 SplashScreen 当前代码显示在开始 HomePage

在启动画面中,我需要在加载所有数据后切换到主页。这是代码:

  Widget build(BuildContext context) {
TenderApiProvider apiProv = Provider.of<TenderApiProvider>(context);
return StreamBuilder(
stream: apiProv.resultController,
builder: (BuildContext context, AsyncSnapshot snapshot) {
//...
if(apiProv.apiKeyLoadingState == ApiKeyLoadingState.Done && apiProv.regionsLoadingState == RegionsLoadingState.Done)
{
Navigator.of(context).pushNamed("/"); // Should it be placed in Build??
}
});
}

你能帮我在应用启动 SplashScreen 时显示 to 绘图,然后从它切换到 HomePage 吗?

最佳答案

您需要将 SplashScreen() 包装在 StatefulWidget 中,以便您可以在 initState() 中获取数据。将 fetch() 逻辑包装在 SchedulerBinding.instance.addPostFrameCallback() 中以访问 initState() 中的 BuildContext 很重要。此外,通过这种方式,您可以避免与在实际构建时被销毁的渲染对象发生冲突。

下面是一个完整的最小示例。编辑:您不能在 initState({}) 中使用 await。

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Wrapper(),
);
}
}


class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {

@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) {
_loadDataAndNavigate()
});
}

_loadDataAndNavigate() async {
// fetch data | await this.service.fetch(x,y)
Navigator.of(context).pushNamed('/');
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: SplashScreen(),
);
}
}

关于flutter - 无法将此叠加小部件标记为需要构建,因为框架已经在构建小部件的过程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57605244/

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