在Flutter中使用BLoC模式时,对于应用程序代码的结构化,什么被认为是良好的编程实践?
这是一个宽泛的问题,我将尝试举个例子。假设您定义了一个BLoC类来处理特定小部件的验证,并且您想通过发出各种事件来更新验证消息,以便填充表单。
据我所知,您的BLoC可能如下所示:
这是一个宽泛的问题,我将尝试举个例子。假设您定义了一个BLoC类来处理特定小部件的验证,并且您想通过发出各种事件来更新验证消息,以便填充表单。
据我所知,您的BLoC可能如下所示:
import 'dart:async';
import 'package:myproject/bloc/base_bloc.dart';
import 'package:rxdart/rxdart.dart';
class SignUpBloc extends Bloc {
BehaviorSubject<String> _emailSubject;
BehaviorSubject<String> _nameSubject;
BehaviorSubject<String> _phoneSubject;
BehaviorSubject<String> _signUpSubject;
SignUpBloc() {
_emailSubject = new BehaviorSubject<String>.seeded('');
_nameSubject = new BehaviorSubject<String>.seeded('');
_phoneSubject = new BehaviorSubject<String>.seeded('');
_signUpSubject = new BehaviorSubject<String>.seeded('');
}
void nameChanged(String content) {
if (content?.isEmpty ?? true) {
_nameSubject.emit('Name is required for the sign-up process');
} else {
_nameSubject.emit('');
}
}
void emailChanged(String content) {
if (!_validEmail(content)) {
_emailSubject.emit(
'Please enter a valid email address (e.g. example@mydomain.com');
} else {
_emailSubject.emit('');
_email = content;
}
}
.
.
// Other functions are used to emit various messages here
.
.
Stream<String> get emailStream => _emailSubject.stream;
Stream<String> get nameStream => _nameSubject.stream;
Stream<String> get phoneStream => _phoneSubject.stream;
Stream<String> get signUpStream => _signUpSubject.stream;
}
然后在您的UI/视图中,您可能会执行类似以下操作:
StreamBuilder<String>(
stream: _bloc.emailStream,
builder: (context, snapshot) {
return Padding(
padding: EdgeInsets.only(top: 5.0),
child: Text(
snapshot?.data ?? '',
),
);
},
对我来说,这段代码有一种不好的代码气味......特别是,似乎很混乱地不断定义BehaviorSubjects,然后编写方法以启用对它们对应的流的访问。我在网上找到的所有示例都定义了一种非常类似的方法,虽然它确实可以将业务逻辑与UI分离,但感觉需要大量重复努力来定义和暴露subjects。
BlocProvider.of<YourBlocType>(context)
访问它。然后你可以在结果上调用add(event)
(当然是请求的 Bloc)。 - stewemetal