FutureBuilder 构建函数不得返回 Null 错误

时间:2021-02-05 05:45:09

标签: flutter

我正在学习颤振,在练习中我构建了一个应用程序,该应用程序很少出现下面提到的错误。

我无法确定返回错误的部分以及为什么我很少收到此错误,其余时间我的应用程序在没有此错误的情况下工作。

请注意,即使我在几秒钟主屏幕呈现后出现此错误,然后应用程序也能正常运行。正因为如此,我觉得错误出在加载部分,我附上了我的 SpinKitRotatingCircle 在容器中,但没有解决问题。


在 MyApp StatelessWidget 中,我将创建 MaterialApp 3 次(一次表示成功,一次表示挂起,一次表示错误)。是他们的一种方式,我可以将它们合并到一个单一的材料应用程序中。


代码:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();
  @override
  Widget build(BuildContext context) {
    // return MaterialApp(
    //   home: Wrapper(),
    // );
    return FutureBuilder(
      future: _initialization,
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return MaterialApp(
            home: Scaffold(
              backgroundColor: Colors.brown[100],
              appBar: AppBar(
                backgroundColor: Colors.brown[400],
                title: Text('Error Loading Brew Crew'),
                centerTitle: true,
              ),
              body: Center(
                  child: AlertDialog(
                title: Text('Error Loading Brew Crew'),
                content: Text(snapshot.error.toString()),
                actions: <Widget>[
                  FlatButton(
                    onPressed: () => exit(0),
                    child: Text('OK'),
                  ),
                ],
              )),
            ),
          );
        }
        if (snapshot.connectionState == ConnectionState.done) {
          return StreamProvider<User>.value(
            value: AuthService().user,
            child: MaterialApp(
              home: Wrapper(),
            ),
          );
        }
//Loading
        print('Initializing Flutter');
        MaterialApp(
          home: Scaffold(
            backgroundColor: Colors.brown[100],
            appBar: AppBar(
              backgroundColor: Colors.brown[400],
              title: Text('Loading Brew Crew'),
              centerTitle: true,
            ),
            body: Center(
                child: SpinKitRotatingCircle(
              color: Colors.black,
              size: 50.0,
            )),
          ),
        );
      },
    );
  }
}

错误:

enter image description here

2 个答案:

答案 0 :(得分:1)

你有 if (snapshot.hasError) if (snapshot.connectionState == ConnectionState.done) 返回一些东西。
但是在两个 if 之后,您的 MaterialApp 没有返回。
因此,如果您的快照不能一分为二,则您的代码将不会返回任何内容。
只需将 return 添加到 MaterialApp 下的 print('Initializing Flutter');

答案 1 :(得分:1)

Firebase.initializeApp() 是一个异步函数,所以在一段时间内它不会有值。

在此期间,您会看到上述错误。

initializeApp 完成并返回 FirebaseApp 对象时,您的 FutureBuilder 将使用该对象重建。

然后执行 FutureBuilder 的这一部分:

if (snapshot.connectionState == ConnectionState.done) {
          return StreamProvider<User>.value(
            value: AuthService().user,
            child: MaterialApp(
              home: Wrapper(),
            ),
          );
        }

但在此之前,您的 has.error 子句不正确,因此不会运行且不会返回任何内容。

在您的 FutureBuilder 底部,您有:

 MaterialApp(
          home: Scaffold(
            backgroundColor: Colors.brown[100],
            appBar: AppBar(
              backgroundColor: Colors.brown[400],
              title: Text('Loading Brew Crew'),
              centerTitle: true,
            ),
            body: Center(
                child: SpinKitRotatingCircle(
              color: Colors.black,
              size: 50.0,
            )),
          ),
        );

请注意,您已经创建了一个 MaterialApp,但您还没有return MaterialApp

这就是大红色错误屏幕显示的地方和原因,因为您的 FutureBuilder 没有返回任何小部件并且您不允许返回任何内容。

您已多次重复使用 MaterialApp 小部件,这会为您的代码增加一些干扰,而且没有必要。也许尝试这样的事情:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.brown[100],
        appBar: AppBar(
          backgroundColor: Colors.brown[400],
          title: Text('Loading Brew Crew'),
          centerTitle: true,
        ),
        body: FutureBuilder(
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return Center(
                  child: AlertDialog(
                    title: Text('Error Loading Brew Crew'),
                    content: Text(snapshot.error.toString()),
                    actions: <Widget>[
                      FlatButton(
                        onPressed: () => exit(0),
                        child: Text('OK'),
                      ),
                    ],
                  ));
            }
            if (snapshot.hasData) {
              return StreamProvider<User>.value(
                value: AuthService().user,
                child: Wrapper(),
              );
            }
            return Center(
                child: SpinKitRotatingCircle(
                  color: Colors.black,
                  size: 50.0)
            );
          },
        ),
      ),
    );
  }
}