类型 'BehaviorSubject<dynamic>' 不是 'stream' 的类型 'Stream<String>' 的子类型
type 'BehaviorSubject<dynamic>' is not a subtype of type 'Stream<String>' of 'stream'
我遇到了这个奇怪的错误,我似乎无法解决这个问题。我在我的登录页面中实现了 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。我使用了 streamcontroller 而不是行为主题,我也使用了 publishsubject,但我仍然收到错误。
BehaviorSubject 不需要是 dynamic
类型,因为所有经过的都是字符串,所以最好的解决方法是像这样输入它:
BehaviorSubject<String>()
我遇到了这个奇怪的错误,我似乎无法解决这个问题。我在我的登录页面中实现了 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。我使用了 streamcontroller 而不是行为主题,我也使用了 publishsubject,但我仍然收到错误。
BehaviorSubject 不需要是 dynamic
类型,因为所有经过的都是字符串,所以最好的解决方法是像这样输入它:
BehaviorSubject<String>()