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

标签 flutter

我有关注应用:

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/

相关文章:

file-upload - 用于 firebase_storage 的 Flutter OnProgressListener?

flutter - 如何将文本对齐到父对齐小部件的中心

android - 如何仅在 Ubuntu 上安装 Android Studio 命令行工具

firebase - 我们可以使用 firebase 和 flutter 来进行身份验证,并使用自定义服务器来处理其他所有事情吗?

google-maps - Flutter:如何保持 Google Map 的小部件不变?

dart - 我们需要从 flutter app icon ontap 启动移动设备日历

flutter - 向下滚动时隐藏底部导航栏,反之亦然

flutter - 如何在页面转换后显示 SnackBar

flutter - 如何在flutter中使用navigator打开非全屏页面?

flutter - 带有多选芯片的警告框在 flutter 中