Объедините два потока в один StreamProvider - PullRequest
0 голосов
/ 06 октября 2019

У меня есть два потока:

  • Stream<FirebaseUser> FirebaseAuth.instance.onAuthStateChanged
  • Stream<User> userService.streamUser(String uid)

Мой userService требует uid аутентифицированного FirebaseUser в качестве параметра.

Поскольку мне, вероятно, потребуется доступ к потоку streamUser () в нескольких частях моего приложения, я бы хотел, чтобы он был провайдером в корне моего проекта.

Вот чтомой main.dart выглядит следующим образом:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    var auth = FirebaseAuth.instance;
    var userService = new UserService();
    return MultiProvider(
      providers: [
        Provider<UserService>.value(
          value: userService,
        ),
      ],
      child: MaterialApp(
        home: StreamBuilder<FirebaseUser>(
            stream: auth.onAuthStateChanged,
            builder: (context, snapshot) {
              if (!snapshot.hasData) return LoginPage();
              return StreamProvider<User>.value(
                value: userService.streamUser(snapshot.data.uid),
                child: HomePage(),
              );
            }),
      ),
    );
  }
}

Проблема в том, что при переходе на другую страницу все, что ниже MaterialApp, изменяется, и я теряю контекст с StreamProvider.

Есть ли способ добавить StreamProvider в список провайдеров MultiProvider? Потому что, когда я пытаюсь, мне также нужно создать другой поток onAuthStateChanged для FirebaseUser, и я не знаю, как объединить их в один провайдер.

1 Ответ

0 голосов
/ 06 октября 2019

Так что это, кажется, работает нормально:

StreamProvider<User>.value(
  value: auth.onAuthStateChanged.transform(
    FlatMapStreamTransformer<FirebaseUser, User>(
      (firebaseUser) => userService.streamUser(firebaseUser.uid),
    ),
  ),
),

Если у кого-то есть сомнения по этому поводу в определенных крайних случаях, пожалуйста, дайте мне знать.

Благодаря pskink для подсказки о flatMap .

...