还是个初学者。以下是我尝试根据用户登录状态重定向用户的示例聊天应用程序。 到目前为止,使用模拟器进行了测试,输出是我所期望的。我的问题是:
1。这是用户重定向的正确方法,还是在更好的重构代码中有更好的方法?
2。可以对“ return materialApp”进行任何重构,因为它非常重复。 (仅更改initialRoute)
3。对RunApp一个StatefulWidget有何影响?因为所有教程通常都将runApp启动为StatelessWidget
import 'package:flutter/material.dart';
import 'package:chatting/screens/login_screen.dart';
import 'package:chatting/screens/registration_screen.dart';
import 'package:chatting/screens/chat_screen.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'dart:async';
void main() => runApp(LoadPage());
class LoadPage extends StatefulWidget {
@override
_LoadPageState createState() => _LoadPageState();
}
class _LoadPageState extends State<LoadPage> {
Future checkIfLoggedIn;
@override
void initState() {
super.initState();
checkIfLoggedIn = FirebaseAuth.instance.currentUser();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<FirebaseUser>(
future: checkIfLoggedIn,
builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return Center(
child: CircularProgressIndicator(
backgroundColor: Colors.lightBlueAccent,
),
);
default:
if (snapshot.hasData)
return MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: ChatScreen.id,
routes: {
ChatScreen.id: (context) => ChatScreen(),
LoginScreen.id: (context) => LoginScreen(),
RegistrationScreen.id: (context) => RegistrationScreen(),
},
);
else
return MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: LoginScreen.id,
routes: {
ChatScreen.id: (context) => ChatScreen(),
LoginScreen.id: (context) => LoginScreen(),
RegistrationScreen.id: (context) => RegistrationScreen(),
},
);
}
});
}
}
答案 0 :(得分:0)
是的,您的代码对我来说看起来不错。在runApp
中使用StatefulWidget没问题。
我唯一要提供的提示是,通常对于大型应用程序,您将需要使用BLoC模式来管理状态。如果将这种模式添加到此代码示例中,它将从该组件中抽象出您正在执行的逻辑,并且您可以在集团中管理未来。然后,您可以在加载屏幕上使用无状态窗口小部件。 Flutter Bloc library提供了有用的,直接的抽象,它们展示了如何实现集团模式。