我创建了一个中等复杂的 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