flutter - 为什么 BehaviorSubject 总是返回空值?

标签 flutter dart rxdart

我在从 BehaviorSubject 获取值时遇到问题。我创建了一个 有两个 TextField 和一个 Button 的 flutter 屏幕,我收到了 他们的数据具有 block 模式。

但是当我更改 TextFields 值时,BehaviorSubject 的值 连接到 TextFiled 得到 null,当我更改 TextField 值时, 连接到 TextFields 的两个 TextFiled 的值变为空。

使用 flutter 和 dart:

    import 'dart:async';

    import 'package:bloc_provider/bloc_provider.dart';
    import 'package:rxdart/rxdart.dart';
    import 'package:sense_app_flutter/models/user.dart';
    import 'package:sense_app_flutter/resources/user/provider.dart';

    enum LoginStatus { SUCCESS, LOADING, ERROR }

    class LoginState {
      final LoginStatus status;
      final String message;

      LoginState({this.status, this.message});
    }

    class LoginBloc implements Bloc {
      final UserRepository _userRepository = UserRepository();
      final PublishSubject<LoginState> _loginStateSubject = new PublishSubject();
      final _user = PublishSubject<User>();
      final _usernameController = BehaviorSubject<String>();
      final _passwordController = BehaviorSubject<String>();

      Observable<LoginState> get loginStateStream => _loginStateSubject.stream;

      Function(String) get usernameChange => _usernameController.sink.add;
      Function(String) get passwordChange => _passwordController.sink.add;
      void changeLoginStatus({LoginState state}) =>
          _loginStateSubject.sink.add(state);

      Stream<String> get username =>
          _usernameController.stream.transform(_updateEmail);
      Stream<String> get password =>
          _passwordController.stream.transform(_updatePassword);
      Stream<bool> get submitCheck =>
          Observable.combineLatest2(username, password, (e, p) => true);

      void loginSubmit() async {
        String valUsername = _usernameController.value;
        print(valUsername);
        changeLoginStatus(
            state: LoginState(status: LoginStatus.LOADING, message: "loading"));
        // print("asdas ${username.last.toString()}");
        try {
          User user = await _userRepository.login("stevanus1997", "asdasd123");
          print(user);
          _user.sink.add(user);
          changeLoginStatus(
              state: LoginState(status: LoginStatus.SUCCESS, message: "success"));
        } catch (err) {
          print(err);
          changeLoginStatus(
              state:
                  LoginState(status: LoginStatus.ERROR, message: err.toString()));
        }
      }

      @override
      void dispose() {
        _usernameController.close();
        _passwordController.close();
        _loginStateSubject.close();
        _user.close();
      }

      var _updateEmail =
          StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
        if (email == "" || email.trim() == "") {
          sink.addError("Email can not be empty");
        } else {
          sink.add(email);
        }
      });

      var _updatePassword = StreamTransformer<String, String>.fromHandlers(
          handleData: (password, sink) {
        if (password == "" || password.trim() == "") {
          sink.addError("Password can not be empty");
        } else {
          sink.add(password);
        }
      });
    }

我期望从输入中输出,但总是返回 null。

最佳答案

尝试这样的事情

 final _usernameController = BehaviorSubject<String>.seeded("");

代替

 final _usernameController = BehaviorSubject<String>();

您可以在种子函数中提供默认值

关于flutter - 为什么 BehaviorSubject 总是返回空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229995/

相关文章:

flutter - 我可以将 BuildContext 传递给 Compute 吗?

dart - 如何在 BLOC 的 Flutter 的 BottomNavigationBar 中设置 currentIndex?

flutter - Dart如何访问多维 map 中的第二维

android - 优化 Google 移动广告在 Flutter 上的初始化和加载

dart:代理注解用法

flutter - BehaviorSubject 添加相同的值

flutter - 如何比较 Dart 中的文件/流平等

android-studio - Flutter:找不到 providerinstaller 的本地模块描述符类

dart - 尝试根据 JSON 字符串值动态设置图标

Flutter Admob 包阻止我的应用程序构建