【问题标题】:How To Make Streams in flutter dart work with provider如何使颤振飞镖中的流与提供者一起使用
【发布时间】:2019-12-12 03:24:58
【问题描述】:

这最初是有效的,但它刚刚停止,我无法弄清楚问题出在哪里。

我正在提供程序包中的颤振项目中使用流。流是从服务文件发出的,并且正在小部件文件上进行侦听。 Firebase onAuthStateChanged 流正在运行,但我的流不起作用。

我的文件中有很多代码,所以我不打算在这里发布所有内容。

我对 AuthStatus 流有疑问 我尝试订阅小部件类上的流,但似乎没有发出任何流

  MyApp(){
    auth.authStateStream.listen((d){print("$d is data");});
  }

Firebase 流是如何从服务文件中发出的

  Stream<UserModel> get onAuthStateChanged{
      return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
  }

我对 AuthStatus 流有疑问。这最初是有效的 这就是从服务文件中获取 AuthStatus 流的方式

  //Services file
  final StreamController<AuthStatus> _currentAuthStateController =
      StreamController<AuthStatus>.broadcast();

  Stream<AuthStatus> get authStateStream{
    return _currentAuthStateController.stream;
  }


  void testStremas() {
    //Stoast.setMessage("Test Message");
    _currentAuthStateController.add(AuthStatus.ACTIVE);
  }

这就是提供者作为 MaterialAPP 小部件的父级对流进行监听的方式

class MyApp extends StatelessWidget {
  //I was trying if i my widget could subscribe to the stream
  MyApp (){
    auth.authStateStream.listen((d){print("$d is data");});
  }
  final ToastHelper toast = ToastHelper();

  final ThemeHelper theme = ThemeHelper();

  final AuthService auth = AuthService();

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<UserModel>.value(value: auth.onAuthStateChanged),
        StreamProvider<ToastMessage>.value(value: toast.onNewMessage),
        StreamProvider<AuthStatus>.value(
            value: auth.authStateStream, initialData: AuthStatus.NONE),
      ],
      child: MaterialApp(
        title: Strings.appName,
        theme: theme.darkThemeData(),
        home: Loader(),
        routes: {
          'home': (context) => Home(),
        },
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}

这是通过单击按钮在小部件上调用上述方法的方式

 //Widgets file 
  onTap: () => auth.testStremas(),

预期结果应该是当服务文件中的 AuthStatus 更改时,应该通过提供程序包通知小部件。提前致谢

Widget _body(BuildContext context) {
    final AuthStatus _authStatus = Provider.of<AuthStatus>(context);
    return Center(
      child: Container(
        constraints: BoxConstraints(maxWidth: 300),
        child: SingleChildScrollView(
            child: Center(
              child: _authStatus == AuthStatus.ACTIVE
                  ? Padding(
                    padding: const EdgeInsets.all(8.0),
                    child:CircularProgressIndicator(strokeWidth: 2,)
                  )
                  : _buildScreen(context),
            )),
      ),
    );
  }

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore stream


    【解决方案1】:

    我不确定 - 尝试改变

    final StreamController<AuthStatus> _currentAuthStateController =
      StreamController<AuthStatus>.broadcast();
    

    final StreamController<AuthStatus> _currentAuthStateController =
      BehaviorSubject<AuthStatus>();
    

    这个 BehaviorSubject 来自 rxdart 库 https://pub.dev/packages/rxdart,所以,你应该导入它。 BehaviorSubject 是保持流的最后状态。你可以在这里阅读更多内容https://pub.dev/documentation/rxdart/latest/rx/BehaviorSubject-class.html

    import 'package:rxdart/rxdart.dart';
    

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2020-11-28
      • 1970-01-01
      • 2019-02-05
      • 2021-03-06
      • 1970-01-01
      • 2020-01-28
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多