MaterialPageRoute构建器内部的Future返回null

时间:2018-12-11 22:30:39

标签: flutter

在推送ProfileWidget路由之前,需要向服务器查询对象。

不确定错误消息是否与MaterialPageRoute的构建器中的Future调用有关(请参见routes函数)?

错误

  

颤振:引发了另一个异常:路线“ null”的构建器返回了null。

..
       @override
          Widget build(BuildContext context) {
            return new MaterialApp(
              onGenerateRoute: routes,
              debugShowCheckedModeBanner: false,
              theme: new ThemeData(
                  primarySwatch: Colors.blueGrey,
                  textTheme: TextTheme(

                  )
              ),
              home: ...,
            )
            ;
          }

          Route routes(RouteSettings settings) {
            if (settings.name.startsWith("/profile")) {
              String username = settings.name.replaceFirst("/profile/", '');
              return MaterialPageRoute(
                  builder: (context) {
                    api.fetchProfile(username)
                        .then((profile) {
                      return ProfileWidget(profile);
                    });
                  }

              );
            }
          }

1 个答案:

答案 0 :(得分:1)

是的,这就是问题所在。异步方法在构建函数中无法正常工作,因为构建函数期望立即返回一个小部件-通过使用Future,您实际上只是返回null。

另一个问题是,您正在build函数中调用api-请仔细考虑...只要小部件中的任何更改都会调用build函数。您是否真的想每次发生时都获取个人资料?

相反,我建议使用FutureBuilder并在initState中启动future,或者在完成后在initState中启动future,并使用setState(()...)。无论哪种方式,如果以这种方式进行操作,则必须处理在创建配置文件之前需要很短时间的情况,除非您考虑进行诸如将配置文件加载从小部件中移出到主函数中的操作(我不知道是否真的建议这样做,但这似乎对我有用)。

您甚至可能考虑将配置文件放入InheritedWidget或ScopedModel中,这样,如果您更改登录用户,它将自动传播。

相关问题