Flutter StreamProvider не может обновить состояние виджета. Как мне обойти это?

Я использую StreamProvider, чтобы фиксировать изменения, происходящие в Firestore, и отображать их на домашней странице пользователя. Когда пользователь впервые входит в систему или регистрируется, он направляется на эту домашнюю страницу и ожидает увидеть свои данные, для чего я использую StreamProvider.

Помня, что первое полученное значение будет нулевым, я добавил виджет загрузки текста. Однако виджет, похоже, не изменится, если я не обновлю страницу в горячем режиме и виджет с отслеживанием состояния снова не будет перестроен. Похоже, что происходит то, что виджет с отслеживанием состояния, который я использую в качестве своей домашней страницы, «создается» только один раз, из-за чего, даже когда поток заполняется ненулевыми значениями, виджет загрузки не исчезает, потому что его родительский виджет не исчезает. т перестроить.

Это базовый виджет HomeScreen, вокруг которого я оборачиваю свой StreamProvider.

      @Override
Widget build(BuildContext context) {
    return StreamProvider<UserDataModel>.value(
      initialData: null,
      value: DatabaseServices(userDetails: _userDetails).userDataDocument,
      updateShouldNotify: (previous, current) => true,
      child: Scaffold(
        backgroundColor: Colors.white,
        body: HomeBody(),
      )
    );
  }

Это соответствующий фрагмент из виджета HomeBody.

      class HomeBody extends StatefulWidget {
  @override
  _HomeBodyState createState() => _HomeBodyState();
}

class _HomeBodyState extends State<HomeBody> {
  @override
  Widget build(BuildContext context) {
    final AuthenticationServices _authServices = AuthenticationServices();
    final UserDataModel _data = Provider.of<UserDataModel>(context);
    print(_data);
    print((_data != null) ? _data.name : 'NULL');
    /* Some code */
    Row(
      children: [
         Padding(
             padding: const EdgeInsets.fromLTRB(25, 0, 0, 5),
             child: Text(_data != null ? _data.name : 'LOADING...', style: dashboardName),
                ),
              ],
            ),
     Row(
       children: [
          Padding(
              padding: const EdgeInsets.fromLTRB(25, 2, 0, 5),
              child: Text(_data != null ? _data.scholarId : 'LOADING...', style: dashboardName),
                ),
              ],
            ),

Я также заметил, что операторы печати, которые я использовал для отладки, выполняются только после печати этих начальных нулевых значений, пока я не обновляю страницу и не показываю ненулевые значения.

Есть ли способ обойти это? Я застрял на пару дней, не добившись каких-либо значительных успехов, и любые рекомендации были бы признательны.

0 ответов

Другие вопросы по тегам