Трепетание - когда делать первоначальный запрос, используя ChangeNotifierProvider? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть класс 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);
      }
    }
  }
}
...