Flutter如何创建StreamProvider并稍后订阅 [英] How to create a StreamProvider and subscribe to it later, Flutter
问题描述
我遇到一个问题,我想用一些不同的提供程序创建一个 MultiProvider
,问题是其中两个是StreamProviders,它们需要首先具有Firebase身份验证登录名,然后再订阅根据用户登录的结果在Firebase中创建一个Stream.
I have an issue where I want to create a MultiProvider
with some different providers, the problem is that two of those are StreamProviders that require first to have a firebase auth login, and after that subscribe to a Stream in firebase based on the result of the user logged in.
因此,如果我无法在 MaterialApp
顶部的登录名之前启动 StreamProvider
.
So if I cannot launch the StreamProvider
before the login at the top of my MaterialApp
.
如果我在登录完成后声明了这些提供程序,则会收到一条错误消息,指出该提供程序不在正确的路由上,因为我需要围绕我的所有应用程序使用多条路由中的数据.
If I declare those providers after the login is complete I get an error that the provider is not on the correct route because I need the data in several routes around all my app.
这是我的代码:
class Neybor extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = GoogleFonts.nunito;
return MultiProvider(
providers: [
ChangeNotifierProvider<Data>(create: (context) => new Data()),
/// Settings Stream
StreamProvider<SettingsDataModel>.value(
value: Globals.firebaseCaller.settings(),
),
/// Plans Stream
StreamProvider<PlansDataModel>.value(
value: Globals.firebaseCaller.plans(),
),
],
child: MaterialApp(
...
}
对于 Globals.firebaseCaller.settings()
和 Globals.firebaseCaller.plans()
,我使用注册用户uid
For Globals.firebaseCaller.settings()
and Globals.firebaseCaller.plans()
I use the register user uid
有没有一种方法可以声明一个 StreamProvider
并稍后在我的代码上进行订阅?
Is there a way to declare a StreamProvider
and subscribe to it later on my code?
预先感谢
推荐答案
在 StreamProvider
中使用 create
参数传递您的流并使用 Provider对其进行订阅.of< T>(上下文)
Use create
parameter in the StreamProvider
to pass your stream and subscribe to it using Provider.of<T>(context)
class Neybor extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = GoogleFonts.nunito;
return MultiProvider(
providers: [
/// Settings Stream
/// Globals.firebaseCaller.settings() should returns a Stream<SettingsDataModel>
StreamProvider<SettingsDataModel>(create: (context) =>
Globals.firebaseCaller.settings(),
),
],
child: HomeView()
..
然后在HomeView()
then in the HomeView()
import 'package:provider/provider.dart';
class HomeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
SettingsDataModel settings = Provider.of<SettingsDataModel>(context);
if (settings == null) {
return Align(child: new CircularProgressIndicator());
} else {
// your code
...
}
...
这篇关于Flutter如何创建StreamProvider并稍后订阅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!