如您所见,在您的应用中实现 Bloc 的方法不止一种。您上面提到的类实际上来自不同的包:PublishSubject 和 BehaviorSubject 来自 rxdart 包,而 StreamController 在 Flutter SDK 包中 dart:async
但是,您不需要使用全部甚至其中任何一个来在您的 Flutter 应用程序中实现 Bloc。我将在不使用任何包的情况下通过实现 Bloc 来做一个示例:
1.以普通方式实施 Bloc:
您可以使用 Flutter SDK 中的内容实现 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 概念一致地构建 bloc 的方法,rx_dart 提供了许多工具,因此您可以根据自己的需要操纵 Stream。你可能会看到有人提到provider,它的主要目的是向下传递一个对象,并在你的应用程序中创建一个数据流。
每一个都已经相当成熟并被许多程序员实现了。我建议您仅在您以普通方式实现 Bloc 之后再查看每个文档的文档,这样您就可以真正了解他们在幕后所做的事情。