【问题标题】:type 'BehaviorSubject<dynamic>' is not a subtype of type 'Stream<String>' of 'stream''BehaviorSubject<dynamic>' 类型不是 'stream' 的 'Stream<String>' 类型的子类型
【发布时间】:2020-07-02 16:21:07
【问题描述】:

我遇到了这个奇怪的错误,我似乎无法解决这个问题。我正在我的登录页面中实现 bloc 模式。我似乎无法指出我做错了什么。这是我的代码

login_bloc.dart

import 'package:rxdart/rxdart.dart';
import 'dart:async';

class LoginBloc extends Object with Validators {
  final _emailController = BehaviorSubject<dynamic>();
  final _passwordController = BehaviorSubject<dynamic>();

  Function(String) get emailChanged => _emailController.sink.add;
  Function(String) get passwordChanged => _passwordController.sink.add;

  Stream<String> get emailValidator => _emailController.stream.transform(emailValidators);
  Stream<String> get passwordValidator =>  _passwordController.stream.transform(passwordValidators);

  Stream<bool> get submitCheck => Rx.combineLatest2(emailValidator, passwordValidator, (e, p) => true);

  dispose() {
   _emailController?.close();
   _passwordController?.close();
 }
}

mixin Validators {
  var emailValidators =
  StreamTransformer<String, String>.fromHandlers(handleData: (email, sink) {
   if (email.contains("@")) {
     sink.add(email);
   } else {
     sink.addError("Email is not valid");
   }
});

  var passwordValidators = StreamTransformer<String, String>.fromHandlers(
     handleData: (password, sink) {
    if (password.length > 0) {
      sink.add(password);
    } else {
      sink.addError("Password Field should not be empty");
    }
 });
}

final loginBloc = LoginBloc();

这是我创建的调用 bloc 的小部件

  Widget _emailPasswordWidget() {
return Column(
  children: <Widget>[
    Container(
  margin: EdgeInsets.symmetric(vertical: 10),
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      Text(
        'Email ID',
        style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
      ),
      SizedBox(
        height: 10,
      ),
      StreamBuilder<String>(
        stream: loginBloc.emailValidator,
        builder: (context, snapshot) {
          return TextField(
              onChanged: loginBloc.emailChanged,
              obscureText: false,
              decoration: InputDecoration(
                  errorText: snapshot.error,
                  border: InputBorder.none,
                  fillColor: Color(0xfff3f3f4),
                  filled: true));
        }
      )
    ],
  ),
)
   loginBloc.passwordChanged),
  ],
);
}

我将不胜感激任何帮助。我在网上查了一下,没有看到任何帮助。我正在使用 rxdart 版本 ^0.23.1。我使用了流控制器而不是行为主题,并且我也使用了发布主题,但仍然出现错误。

【问题讨论】:

    标签: flutter rxdart


    【解决方案1】:

    当经过的所有内容都是字符串时,没有必要将 BehaviorSubject 类型设为 dynamic,因此最好的解决方法是这样输入:

    BehaviorSubject<String>()
    

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 2021-08-18
      • 1970-01-01
      • 2021-09-18
      • 2021-08-12
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多