今天實在是身體太疲憊了,內容上會相對比較少一些(起床後再補字數了)
但重要的資訊及觀念會將其列在這邊以供讀者們參考
那~讓我們開始今天的主題吧
今天打算花些篇幅來描述一下 Bloc 這個狀態管理的套件
以及其使用方式
而 Bloc 所想達到的目的便是將 表現層
及 業務邏輯層
給抽離開來
Bloc 本身支援 Dart、Flutter 亦或是 AngularDart
我們這裡主要要介紹的是 flutter_bloc
在 Flutter 的安裝方式
flutter pub add flutter_bloc
Bloc 主要有三大的核心思想
A stream is a sequence of asynchronous data.
在開始說明之前我們應先對 Streams 有基本的認知
而在 Dart 建立起 Stream 的方法如下
Stream<int> countStream(int max) async* {
for (int i = 0; i < max; i++) {
yield i;
}
}
透過宣告 async*
我們便可以在函式使用 yield
並且回傳 Stream
資料
而在取得資料的部分的話
則可透過
Future<int> sumStream(Stream<int> stream) async {
int sum = 0;
await for (int value in stream) {
sum += value;
}
return sum;
}
而兩者合在一起則會變成
void main() async {
/// Initialize a stream of integers 0-9
Stream<int> stream = countStream(10);
/// Compute the sum of the stream of integers
int sum = await sumStream(stream);
/// Print the sum
print(sum); // 45
}
在 Cubit 上會暴露著許多可以改變狀態的函式以提供給外部使用
在創建 Cubit 時,得預先設定 Cubit 所操作的狀態類別。
class CounterCubit extends Cubit<int> {
CounterCubit() : super(0);
}
而在 Cubit 中,可以透過 emit
這個函式來更新操作的狀態內容
class CounterCubit extends Cubit<int> {
CounterCubit() : super(0);
void increment() => emit(state + 1);
}
透過呼叫 close()
則可關閉狀態 Stream.
而透過 listen
可使得狀態改變時觸發訂閱函式
cubit.stream.listen(<function name>)
Cubit 提供 onChange()
函式以供狀態修改時自動呼叫此函式
class CounterCubit extends Cubit<int> {
CounterCubit() : super(0);
void increment() => emit(state + 1);
@override
void onChange(Change<int> change) {
super.onChange(change);
print(change);
}
}