将 Firebase 添加到现有 Flutter 应用程序时,是否可以将 build 重命名为 _build 并从 FutureBuilder 调用它?

时间:2021-04-25 03:12:57

标签: firebase flutter flutter-futurebuilder

我创建了一个中等复杂的 MyApp 类(对于我作为一个新的 flutter 用户)--

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appName,         // Browser tab name  JAV
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: WelcomeScreen.id,
      routes: {
        '/myHomePage': (context) => MyHomePage(   // to be deleted soon
          title: 'my home page'
        ),
        //ChatScreen.id: (context) => ChatScreen(),
        LoginScreen.id: (context) => LoginScreen(),
        NotImplementedScreen.id: (context) => NotImplementedScreen(),
        RegisterScreen.id: (context) => RegisterScreen(),
        //SignUpScreen.id: (context) => SignUpScreen(),
        WelcomeScreen.id: (context) => WelcomeScreen(),   // == default route == initial route.
      }, // routes
      debugShowCheckedModeBanner: false,  // Remove the 'DEBUG' banner in the top right corner.
    );
  } // _build
} // class

--当我决定使用一些 FlutterFire(又名 Firebase for Flutter)代码时。一旦我添加了 FutureBuilder(或 StatefulWidget)代码来正确初始化 Firebase(每个 https://firebase.flutter.dev/docs/overview),代码看起来会多么混乱,这让我感到困扰。

然后我意识到我可以通过将我现有的构建方法重命名为 _build 并让 FutureBuilder 在初始化完成时返回它来保持代码干净 [我认为这个想法有时被称为 Copelien 的信封信 idion?]。我试了一下,它似乎起作用了。

我明天会测试更多,但我真的很想听听一些经验丰富的 Flutter/Firebase 开发人员的意见,关于这种方法是否存在对新手来说并不明显的问题。实现如下所示。提前感谢您的时间!

class MyApp extends StatelessWidget {
  // Create the initialization Future outside of `build`:
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      // Initialize FutterFire:
      future: _initialization,
      builder: (context, snapshot) {
        // Check for errors
        if (snapshot.hasError) {
          String err = 'Something went wrong! Firebase initialization error: ${snapshot.error.toString()}';
          print (err);
          return Text(err);
        }
        // Once complete, show your application
        if (snapshot.connectionState == ConnectionState.done) {
          return _build(context);    // <<<<<<<<< Call previous version of build here!
        }
        // Otherwise, show something whilst waiting for initialization to complete
        return Center(
          child: CircularProgressIndicator(),
        );
      },
    ); // FutureBuilder
  } // build

  // This is the build method from before adding Firebase.
  Widget _build(BuildContext context) {
    return MaterialApp(
      title: appName,         // Browser tab name  JAV
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: WelcomeScreen.id,
      routes: {
        '/myHomePage': (context) => MyHomePage(   // to be deleted soon
          title: 'my home page'
        ),
        //ChatScreen.id: (context) => ChatScreen(),
        LoginScreen.id: (context) => LoginScreen(),
        NotImplementedScreen.id: (context) => NotImplementedScreen(),
        RegisterScreen.id: (context) => RegisterScreen(),
        //SignUpScreen.id: (context) => SignUpScreen(),
        WelcomeScreen.id: (context) => WelcomeScreen(),   // == default route == initial route.
      }, // routes
      debugShowCheckedModeBanner: false,  // Remove the 'DEBUG' banner in the top right corner.
    );
  } // _build
} // class

0 个答案:

没有答案