Как видите, есть несколько способов реализовать Bloc в ваших приложениях. Упомянутый вами выше класс фактически принадлежит к разным пакетам: PublishSubject
и BehaviorSubject
из пакета rxdart, а StreamController
- в пакете Flutter SDK dart: async
Однако от вас не требуется использовать все или даже какие-либо из них для реализации Bloc в ваших приложениях Flutter. Я сделаю пример, реализовав Bloc без использования какого-либо пакета:
1. Реализуйте Bloc обычным способом:
Вы можете реализовать Bloc, используя то, что есть в Flutter SDK, без использования других пакетов. Обычно вы создаете блочный класс, отделяющий вашу логику от пользовательского интерфейса. Класс может выглядеть так:
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();
}
}
Тем временем в пользовательском интерфейсе вы запускаете 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
обеспечивает способ согласованной структуры вашего блока с использованием концепций блока / события / состояния, rx_dart
предоставляет множество инструментов, так что вы можете манипулировать Stream
по своему усмотрению. Вы также можете увидеть людей, упомянутых provider, его основная цель - передать объект вниз по дереву виджетов и создать поток данных через ваше приложение.
Каждый из них уже достаточно зрел и реализован многими программистами. Я рекомендую изучать документацию каждого из них только после реализации Bloc ванильным способом, чтобы вы действительно могли понять, что они делают за кулисами.
person
Bach
schedule
26.02.2021