Flutter Provider - установка ошибки Streamprovider в home.dart - PullRequest
0 голосов
/ 06 мая 2020

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

Ошибка

Another exception was thrown: Error: Could not find the correct Provider<List<FireFavorites>> above this Favorites Widget

home.dart

    return MultiProvider(
      providers: [
        StreamProvider.value(
          value: db.streamFavorites(user.uid),
        )
      ],
      child: Scaffold(
        body: StreamBuilder<NavBarItem>(
          stream: _bottomNavBarBloc.itemStream,
          initialData: _bottomNavBarBloc.defaultItem,
          builder: (BuildContext context, AsyncSnapshot<NavBarItem> snapshot) {
            switch (snapshot.data) {
              case NavBarItem.SEARCH:
                return Search();
              case NavBarItem.BROWSE:
                return Browse();
              case NavBarItem.ICON:
                return About();
              case NavBarItem.FAVORITES:
                return Favorites();
              case NavBarItem.SETTINGS:
                return Settings();
              default:
                return null;
            }
          },
        ),
        bottomNavigationBar: ConvexBottomNav(navBarHandler: _navBarHandler),
      ),
    );
  }

класс пользовательского маршрута

class MyCustomPageRoute extends MaterialPageRoute {
  final Widget previousPage;

  MyCustomPageRoute(
      {this.previousPage, WidgetBuilder builder, RouteSettings settings})
      : super(builder: builder, settings: settings);

  @override
  Widget buildTransitions(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation, Widget currentPage) {
    Animation<Offset> _slideAnimationPage1 =
        Tween<Offset>(begin: Offset(0.0, 0.0), end: Offset(-1.0, 0.0))
            .animate(animation);
    Animation<Offset> _slideAnimationPage2 =
        Tween<Offset>(begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0))
            .animate(animation);
    return Stack(
      children: <Widget>[
        SlideTransition(position: _slideAnimationPage1, child: previousPage),
        SlideTransition(position: _slideAnimationPage2, child: currentPage),
      ],
    );
  }
}

с использованием такого класса, который находится в Browse(). Я просто хочу перейти к документу. Но использование MyCustomPageRoute вызывает ошибку Provider.

  Navigator.push(
    context,
    MyCustomPageRoute(
      previousPage: this,
      builder: (context) => Document(
        documentID: docid,
      ),
    ),
  );

Я хотел бы иметь избранное StreamProvider в main.dart, но у меня нет доступа к uid аутентифицированного пользователя там, или я не знаю, как получить к нему доступ после того, как он станет доступен. Ниже показано, как я настроил Provider в main.dart. Я могу просто сделать простой запрос в home.dart, получить избранное и добавить их в Content() и получить к ним доступ во всем приложении, но я бы хотел иметь поток.

main.dart

  return MultiProvider(
      providers: [
        StreamProvider<FirebaseUser>.value(
          value: FirebaseAuth.instance.onAuthStateChanged,
        ),
        ChangeNotifierProvider<Content>.value(
          value: Content(),
        ),
      ],
      child: MaterialApp(
        title: '',
        theme: ThemeData(
          fontFamily: 'OpenSans',
          brightness: Brightness.light,
          primaryColor: Color(0xff2398C3),
        ),
        home: WelcomePage(),
      ),
    );

Есть идеи, как это исправить?

...