У меня есть класс RootPage
, который предоставляется RootModel
с использованием ChangeNotifierProvider
. Эта цель этого класса состоит в том, чтобы загрузить соответствующий виджет в зависимости от того, вошел ли пользователь в систему. Чтобы определить это, я делаю асинхронный запрос в компоновщике (см. Ниже). RootModel
, как ChangeNotifier
будет обновлять состояние и RootPage
будет восстанавливать. Должен ли я не делать этот запрос в сборщике?
1010 * корневая страница *
class RootPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<RootModel>(
builder: (context) {
RootModel model = RootModel(RootState.Init);
model.fetchCurrentUser();
return model;
},
child: Consumer<RootModel>(
builder: (context, model, child) => getWidget(model.state)));
}
Widget getWidget(RootState state) {
switch (state) {
case RootState.NoCommunity:
{
return SearchCommunityPage();
}
case RootState.LoggedIn:
{
return HomePage();
}
case RootState.NotLoggedIn:
{
return WelcomePage();
}
default:
{
return Scaffold(
body: Container(
alignment: Alignment.center,
child: CircularProgressIndicator(),
),
);
}
}
}
}
RootModel
enum RootState { Init, Loading, NotLoggedIn, LoggedIn, NoCommunity }
class RootModel extends BaseModel<RootState> {
final _authService = AuthService();
final _userService = UserService();
RootModel(RootState initialState) : super(initialState);
void fetchCurrentUser() async {
setState(RootState.Loading);
FirebaseUser user = await _authService.current().catchError((e) {
print("login failed: ${e.message}");
});
if (user == null) {
setState(RootState.NotLoggedIn);
} else {
// check if user has a community.
bool hasCommunity = await _userService.hasCommunity(user.uid)
.catchError((e) {
print("community request failed: ${e.message}");
});
if (!hasCommunity) {
setState(RootState.NoCommunity);
} else {
setState(RootState.LoggedIn);
}
}
}
}