欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter狀態(tài)管理Bloc使用示例詳解

 更新時間:2022年10月31日 09:53:12   作者:老李code  
這篇文章主要為大家介紹了Flutter狀態(tài)管理Bloc使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

目前Flutter三大主流狀態(tài)管理框架分別是provider、flutter_bloc、getx,三大狀態(tài)管理框架各有優(yōu)劣,本篇文章將介紹其中的flutter_bloc框架的使用,他是bloc設計思想模式在flutter上的實現,bloc全程全稱 business logic ,業(yè)務邏輯的意思,核心思想就是最大程度的將頁面ui與數據邏輯的解耦,使我們的項目可讀性、可維護性、健壯性增強。

兩種使用模式

首先第一步引入插件:

flutter_bloc: ^8.1.1

引入之后,flutter_bloc使用支持以下兩種模式管理。

Bloc模式,分別有ui層(view)、數據層(state)、事件層(event)、邏輯處理層(bloc),適合大型復雜頁面使用。這四層結構bloc在源碼處就進行了封裝處理,所以我們使用的時候是必須要分離出來的,比如eventstate是要強制分開去寫的。這也導致了簡單頁面使用此模式復雜化的問題,所以這種模式對于簡單頁面是非常沒有必要的,但是如果是復雜頁面的話,非常建議使用此模式,相信你在處理頁面數據邏輯的時候會非常的清晰。
下面我們以計數器為例寫個demo,記住bloc模式有四層,且必須分開,我們建四個文件分別代表這四層,

數據層: 用來存放數據,這個很簡單。

/// 數據層
class DemoState {
// 自增數字
  late int num;
  DemoState init() {
  // 初始化為0
    return DemoState()..num = 0;
  }
  DemoState clone() {
    // 獲取最新對象
    return DemoState()..num = num;
  }
}

事件層: 用來存放頁面所有事件的地方,比如計數器頁面只有初始化事件和自增事件。

/// 頁面中所有的交互事件
abstract class DemoEvent {}
/// 初始化事件
class InitEvent extends DemoEvent {}
/// 自增事件
class IncrementEvent extends DemoEvent {}

Bloc邏輯處理層: 處理上方數據和事件邏輯的地方,通過源碼就能發(fā)現作者的意圖,泛型里必須分開傳入事件和數據,也足以說明這個模式的特點,就是為復雜頁面準備的。

所以如果寫計數器的話,你就會感覺非常沒有必要,因為計數器頁面很簡單,但是當你的state層里的數據非常多且復雜的時候,你就能體會出分開的好處了。

代碼:

/// 邏輯處理層 繼承Bloc
class DemoBloc extends Bloc<DemoEvent, DemoState> {
  ///構造方法
  DemoBloc() : super(DemoState().init()) {
    /// on 注冊所有事件 on固定寫法
    on<InitEvent>(_init);
    on<IncrementEvent>(_add);
  }
  /// 私有化邏輯方法 暴露Event事件即可
  void _init(InitEvent event, Emitter<DemoState> emit) {
  // emit方法,通知更新狀態(tài) 類似于 ChangeNotifier的notifyListeners方法。
    emit(state.clone());
  }
  _add(IncrementEvent event, Emitter<DemoState> emit) {
    state.num++;
    // 調用emit方法更新狀態(tài)
    emit(state.clone());
  }
}

UI層: UI層只負責頁面的編寫,而無需關心數據的生成,根節(jié)點返回BlocProvider,并實現create方法,返回我們的bloc實體類。child實現我們的 UI頁面。

/// UI層
class BlocNumPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  // 以下固定寫法
    return BlocProvider(
      create: (BuildContext context) => DemoBloc()..add(InitEvent()),
      child: Builder(builder: (context) => _buildPage(context)),
    );
  }
  Widget _buildPage(BuildContext context) {
  // 獲取bloc實例
    final bloc = BlocProvider.of<DemoBloc>(context);
    return Stack(
      children: [
        Center(
        // 對于需要更新狀態(tài)的組件 外層包裹一個BlocBuilder,傳入bloc、state
          child: BlocBuilder<DemoBloc, DemoState>(
            builder: (context, state) {
            // 返回具體ui組件
              return Text("點擊了${bloc.state.num}次");
            },
          ),
        ),
        Positioned(
          bottom: 20,
          right: 20,
          child: FloatingActionButton(
            onPressed: () {
            // 調用add方法觸發(fā)自增事件,
              bloc.add(IncrementEvent());
            },
            child: Icon(Icons.add),
          ),
        )
      ],
    );
  }
}

效果:

Cubit模式

Cubit模式,分別有ui層(view)、數據層(state)、邏輯處理層(cubit),相較于bloc模式去掉了event層,適合比較簡單的頁面。跟bloc模式只是邏輯處理哪里發(fā)生了改變,數據層、頁面ui層代碼一模一樣。

可以看到Cubit模式的邏輯就少了很多代碼,而且是直接處理數據即可。通過源碼,作者意圖也很明顯,只是傳遞了數據層。

/// 寫邏輯
class CubitCubit extends Cubit<CubitState> {
  CubitCubit() : super(CubitState().init());
  ///自增
  void increment() => emit(state.clone()..num = state.num + 1);
}

其他寫法跟Bloc是一樣的,就不粘貼了,那看到這有的小伙伴可能就要問了,一個頁面要創(chuàng)建3、4個文件,這也太麻煩了吧,高端的程序員往往不會去寫一些重復性較高的代碼,其實上面的四個文件都是可以通過插件自動生成的,這里下面兩個插件,一個是官方的,官方的不會自動生成ui層的文件,一個是小呆呆寫的,可以自動生成ui層重復性的代碼文件,兩者區(qū)別不大,推薦小呆呆的,因為可以多生成一個文件。

最后

Bloc本質上是一種數據邏輯和UI解耦思想,上面的演示只是非常非常簡單的用法,就可以看出作者在源碼層給我們強制性的設定了非常明確的各個模型,每個模型只專心負責一個事情,這樣看起來一個頁面會非常的清晰,可以說Flutter_Bloc是一個非常適合大型項目使用的狀態(tài)管理框架。

以上就是Flutter狀態(tài)管理Bloc使用示例詳解的詳細內容,更多關于Flutter狀態(tài)管理Bloc的資料請關注腳本之家其它相關文章!

相關文章

  • Android使用SoundPool實現播放音效

    Android使用SoundPool實現播放音效

    這篇文章主要為大家詳細介紹了Android使用SoundPool實現播放音效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android實現可拖拽帶有坐標尺進度條的示例代碼

    Android實現可拖拽帶有坐標尺進度條的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Android實現可拖拽帶有坐標尺進度條的效果,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-06-06
  • Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽

    這篇文章主要為大家介紹了Android開發(fā)手冊Chip監(jiān)聽及ChipGroup監(jiān)聽,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 使用Timer實現網頁勻速加載的進度條樣式

    使用Timer實現網頁勻速加載的進度條樣式

    這篇文章主要介紹了使用Timer實現網頁勻速加載的進度條樣式,在使用WebView加載網頁時有時候網速等原因加載比較慢時,影響用戶的體驗度,今天小編給大家分享使用timer實現網頁勻速加載的進度條樣式,需要的的朋友參考下吧
    2017-01-01
  • Android permission denied原因歸納和解決辦法

    Android permission denied原因歸納和解決辦法

    大家好,本篇文章主要講的是Android permission denied原因歸納和解決辦法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下哦
    2021-12-12
  • Android圖片加載案例分享

    Android圖片加載案例分享

    這篇文章主要為大家分享了Android圖片加載的實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • PC版與Android手機版帶斷點續(xù)傳的多線程下載

    PC版與Android手機版帶斷點續(xù)傳的多線程下載

    這篇文章主要介紹了PC版與Android手機版帶斷點續(xù)傳的多線程下載的相關資料,需要的朋友可以參考下
    2015-10-10
  • 學習使用Android Chronometer計時器

    學習使用Android Chronometer計時器

    Chronometer是一個簡單的計時器,你可以給它一個開始時間,并以計時,或者如果你不給它一個開始時間,它將會使用你的時間通話開始,這篇文章主要幫助大家學習掌握使用Android Chronometer計時器,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android截取指定View為圖片的實現方法

    Android截取指定View為圖片的實現方法

    這篇文章主要為大家詳細介紹了Android截取指定View為圖片的實現方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Android仿微信聯(lián)系人列表字母側滑控件

    Android仿微信聯(lián)系人列表字母側滑控件

    這篇文章主要為大家詳細介紹了Android仿微信聯(lián)系人列表字母側滑控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論