问题描述
最近开始学习Flutter及其BLoC partten,BLoC库中有很多类,比如Bloc
、PublishSubject
、StreamController
、BehaviorSubject
等..
我的问题是,我可以在哪些场景中使用这些类?例如,我可以从 bloc
继承或不从它继承,但为什么呢?我很困惑,这些类的使用场景是什么?
解决方法
如您所见,在您的应用中实现 Bloc 的方法不止一种。您上面提到的类实际上来自不同的包:PublishSubject
和 BehaviorSubject
来自 rxdart 包,而 StreamController
位于 Flutter SDK 包 dart:async>
然而,在 Flutter 应用程序中实现 Bloc 并不需要全部或什至使用它们中的任何一个。我将在不使用任何包的情况下通过实现 Bloc 来做一个例子:
1.以原版方式实现 Bloc:
您可以使用 Flutter SDK 中的内容来实现 Bloc,而无需使用其他包。通常您会创建一个 bloc 类,将您的逻辑与 UI 分开。该类可能如下所示:
import 'dart:async';
// This is the class that handle all the logic such as receiving data from API,process those data,etc (I'll call it a data processing unit)
class YourBloc {
// Create a stream to send processed data to the UI
final StreamController _someController = StreamController();
Stream get someStream => _someController.stream;
// Get the data from API,then send the data to stream here. Usually an async function
void loadData() async {
final data = await doYourApiCall(); // Get data from API
var processedData = processYourData(data);
_someController.add(processedData);
}
dispose() {
_someController.close();
}
}
同时在 UI 中,您启动 loadData() 并使用 StreamBuilder
侦听响应数据:
class _SomeScreenState extends State<SomeScreen> {
// Initiate your bloc
final YourBloc _bloc = YourBloc();
// Make the loadData() call
@override
void initState() {
_bloc.loadData();
super.initState();
}
@override
Widget build(BuildContext context) {
return StreamBuilder( // Listen to the datastream with StreamBuilder
stream: _bloc.someStream,builder: (context,snapshot) {
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: snapshot.data.length,itemBuilder: (context,index) => _buildYourItem(index),);
},);
}
}
2.那么这些包是干什么用的
您可以使用一些包来实现 Bloc,例如 flutter_bloc 或 rxdart。 flutter_bloc
提供了一种使用 Bloc/Event/State 概念一致地构建您的组的方法,rx_dart
提供了许多工具,因此您可以根据自己的需要操作 Stream
。您可能还会看到有人提到 provider,它的主要目的是将一个对象向下传递到小部件树并在您的应用中创建数据流。
每一个都已经相当成熟并被许多程序员实现。我建议您仅在以普通方式实施 Bloc 之后再查看每个文档的文档,这样您就可以真正了解他们在幕后所做的事情。