iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Mobile Development

通徹 Flutter 學習路徑系列 第 13

通徹 Flutter 學習路徑 Day 13 - 今天讓我們來介紹 Bloc ~

  • 分享至 

  • xImage
  •  

前言

今天實在是身體太疲憊了,內容上會相對比較少一些(起床後再補字數了)
但重要的資訊及觀念會將其列在這邊以供讀者們參考
那~讓我們開始今天的主題吧

Bloc

今天打算花些篇幅來描述一下 Bloc 這個狀態管理的套件
以及其使用方式
而 Bloc 所想達到的目的便是將 表現層業務邏輯層 給抽離開來

Bloc 本身支援 Dart、Flutter 亦或是 AngularDart
我們這裡主要要介紹的是 flutter_bloc

在 Flutter 的安裝方式

flutter pub add flutter_bloc

Bloc 主要有三大的核心思想

  1. Simple:容易理解並且適用於各種層級的開發者
  2. Powerful:幫助建置複雜的應用程式透過組裝小組件
  3. Testable:使應用程式測試變得更加容易,讓我們在版本迭代更有自信

核心觀念

Streams

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 時,得預先設定 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);
  }
}

參考資料

Bloc 官方網站


上一篇
通徹 Flutter 學習路徑 Day 12 - 來仿造一個 Messenger 吧!(2)
下一篇
通徹 Flutter 學習路徑 Day 14 - 今天來談談取得靜態資源這件事
系列文
通徹 Flutter 學習路徑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言