最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

flutter Bloc 更新后事件同步與異步詳解

 更新時間:2022年11月14日 15:36:31   作者:李小轟_Rex  
這篇文章主要為大家介紹了flutter Bloc 更新后事件同步與異步詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近,小轟參與了公司 flutter 項目關(guān)于 Dart 2.0 的空安全升級工作。我們升級了所有依賴的三方庫,其中就包括有 Bloc 庫。作為一款使用率頗高的狀態(tài)管理框架, Bloc 在版本迭代中進(jìn)行了少許結(jié)構(gòu)和細(xì)節(jié)的優(yōu)化,下面是小轟對于 Bloc 新版本的使用總結(jié)。

使用方式

小轟使用的 Bloc 版本如下

flutter_bloc: ^7.3.1

通過最簡單的例子來學(xué)習(xí)新知識

  • 創(chuàng)建一個包含 操作的頁面,使用 bloc 來操作 自增 自減 事件。
class _TestBlocPageState extends State<TestBlocPage> {
  late TestDartBloc _bloc;
  @override
  void initState() {
    super.initState();
    _bloc = TestDartBloc(TestDartState(0));
  }
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<TestDartBloc, TestDartState>(
      bloc: _bloc,
      builder: (context, state) {
        return Column(
          children: [
            //顯示當(dāng)前的數(shù)字結(jié)果
            Text(state.num.toString()),
            TextButton(
                onPressed: () {
                  //進(jìn)行自增操作
                  _bloc.add(IncreaseEvent());
                },
                child: Text('add')),
            TextButton(
                onPressed: () {
                  //進(jìn)行自減操作
                  _bloc.add(ReduceEvent());
                },
                child: Text('reduce')),
          ],
        );
      },
    );
  }
}

Blocstateevent 模型定義如下

part of 'test_dart_bloc.dart';
/// Bloc state
class TestDartState {
  int num = 0;
  TestDartState(this.num);
}
part of 'test_dart_bloc.dart';
/// Bloc event
@immutable
abstract class TestDartEvent {}
//自增事件
class IncreaseEvent extends TestDartEvent{}
//自減事件
class ReduceEvent extends TestDartEvent{}

創(chuàng)建 Bloc ,重寫 mapEventToState 接收事件流轉(zhuǎn)狀態(tài)流

import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
part 'test_dart_event.dart';
part 'test_dart_state.dart';
class TestDartBloc extends Bloc<TestDartEvent, TestDartState> {
  TestDartBloc(TestDartState state) : super(state);
  @override
  Stream<TestDartState> mapEventToState(TestDartEvent event) async* {
    if (event is IncreaseEvent) {
      await Future.delayed(Duration(seconds: 10));
      yield TestDartState(state.num + 1);
    } else if (event is ReduceEvent) {
      yield TestDartState(state.num - 1);
    }
  }
}

好了,直接運行如上代碼,我們的demo就能完整的跑起來。但,以上的寫法和低版本的 Bloc 完全一致,在經(jīng)歷高版本迭代后,Bloc 到底做了哪些優(yōu)化呢?

Bloc 新形態(tài)用法

小轟在源碼里看到,重寫 mapEventToState 的使用方式已經(jīng)被棄用了,會在將來的某個版本中徹底刪除該 API

  /// **@Deprecated - Use on<Event> instead. Will be removed in v8.0.0**
  ///
  /// Must be implemented when a class extends [Bloc].
  /// [mapEventToState] is called whenever an [event] is [add]ed
  /// and is responsible for converting that [event] into a new [state].
  /// [mapEventToState] can `yield` zero, one, or multiple states for an event.
  @Deprecated('Use on<Event> instead. Will be removed in v8.0.0')
  Stream<State> mapEventToState(Event event) async* {}

新用法推薦使用 on 來進(jìn)行事件注冊,我們將上面demo中的 bloc 進(jìn)行寫法改造:

class TestDartBloc extends Bloc<TestDartEvent, TestDartState> {
  TestDartBloc(TestDartState state) : super(state) {
    init();
  }
  void init() {
    on<IncreaseEvent>((event, emit) async {
      await Future.delayed(Duration(seconds: 10));
      emit(TestDartState(state.num + 1));
    });
    on<ReduceEvent>((event, emit) {
      state.num - 1;
      emit(state);
    });
  }
}

替換代碼后運行demo,直接成功。

事件隊列的阻塞屬性?

目前最新版本的 Bloc 同時支持 onmapEventToState 兩種寫法,那么這兩種寫法有實際區(qū)別嗎?

小轟在使用老版本(空安全之前)bloc 時總結(jié)過一篇文章 聊聊 Bloc event 的隊列屬性。

blocmapEventToState 方法中,event 隊列是一個阻塞性隊列,先進(jìn)先出,只有當(dāng)上一個事件消費完畢后,才會響應(yīng)隊列中的下一個事件。

如上demo( mapEventToState 方式): 自增事件中模擬耗時了10s,當(dāng)依次點擊 自增自減 按鈕后,由于事件隊列的阻塞特性,自增事件消費10秒后,自減事件才會被 mapEventToState 響應(yīng)。

那么,這個特性在 bloc 迭代新版本后還存在嗎?在最新版本的bloc中,小轟通過demo測試得出結(jié)論:

  • 當(dāng)使用 mapEventToState 方式進(jìn)行事件捕獲時,event 隊列 保持 阻塞 特性。
  • 而使用 on 方式進(jìn)行注冊監(jiān)聽時,event 隊列 默認(rèn)是異步非阻塞的,是互不干擾的。如果把 bloc 當(dāng)作事件總線來使用,小轟認(rèn)為 異步非阻塞 這樣的設(shè)計更為合理。

提問:如果想使用 on 的方式進(jìn)行注冊,還想事件隊列保證順序執(zhí)行即保持阻塞特性,應(yīng)該怎么辦呢? 解答:使用 自定義 transformer,這樣就實現(xiàn)了事件同步隊列。

    on<IncreaseEvent>((event, emit) async {
      await Future.delayed(Duration(seconds: 10));
      emit(TestDartState(state.num + 1));
    },
    transformer: (events, mapper) => events.asyncExpand(mapper),
);

參考鏈接: pub.dev/packages/bl…

以上就是flutter Bloc 更新后事件同步與異步詳解的詳細(xì)內(nèi)容,更多關(guān)于flutter Bloc 更新事件同步異步的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 2014值得推薦的10個移動 Web 應(yīng)用程序開發(fā)框架

    2014值得推薦的10個移動 Web 應(yīng)用程序開發(fā)框架

    今天這篇文章向大家推薦10大優(yōu)秀的移動 Web 開發(fā)框架,幫助開發(fā)者更加高效的開發(fā)移動Web應(yīng)用。
    2014-08-08
  • Retrofit自定義請求參數(shù)注解的實現(xiàn)思路

    Retrofit自定義請求參數(shù)注解的實現(xiàn)思路

    這篇文章主要給大家介紹了Retrofit自定義請求參數(shù)注解的實現(xiàn)思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Android編程使用Intent傳遞對象的方法分析

    Android編程使用Intent傳遞對象的方法分析

    這篇文章主要介紹了Android編程使用Intent傳遞對象的方法,結(jié)合實例形式詳細(xì)分析了Android使用Intent實現(xiàn)傳遞對象的相關(guān)技巧與注意事項,需要的朋友可以參考下
    2016-01-01
  • Android實戰(zhàn)教程第一篇之最簡單的計算器

    Android實戰(zhàn)教程第一篇之最簡單的計算器

    這篇文章主要為大家詳細(xì)介紹了Android實戰(zhàn)教程第一篇,如何實現(xiàn)最簡單的計算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Gradle編譯打包Android apk詳細(xì)介紹

    Gradle編譯打包Android apk詳細(xì)介紹

    這篇文章主要介紹了Gradle編譯打包Android apk詳細(xì)介紹的相關(guān)資料,理解Gradle構(gòu)建過程,解讀Android Gradle插件的配置,需要的朋友可以參考下
    2016-12-12
  • Android中ViewPager1和ViewPager2的使用教程

    Android中ViewPager1和ViewPager2的使用教程

    這篇文章主要介紹了Android中ViewPager1和ViewPager2的使用,效果圖是結(jié)合BottomNavigationView+ViewPager一起使用的,具體實例代碼跟隨小編一起看看吧
    2021-10-10
  • InputFilter實現(xiàn)EditText文本輸入過濾器實例代碼解析

    InputFilter實現(xiàn)EditText文本輸入過濾器實例代碼解析

    EditText是Android的文本輸入框控件。這篇文章給大家介紹 InputFilter實現(xiàn)EditText文本輸入過濾器實例代碼解析,需要的朋友一起看看吧
    2016-11-11
  • 深入理解Android M 鎖屏密碼存儲方式

    深入理解Android M 鎖屏密碼存儲方式

    下面小編就為大家?guī)硪黄钊肜斫釧ndroid M 鎖屏密碼存儲方式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android中如何實現(xiàn)清空搜索框的文字

    Android中如何實現(xiàn)清空搜索框的文字

    本文主要介紹Android中實現(xiàn)清空搜索框的文字的方法。項目中的有關(guān)搜索的地方,加上清空文字的功能,目的是為了增加用戶體驗,使用戶刪除文本更加快捷。需要的朋友一起來看下吧
    2016-12-12
  • android RecyclerView的一些優(yōu)化點介紹

    android RecyclerView的一些優(yōu)化點介紹

    大家好,本篇文章主要講的是android RecyclerView的一些優(yōu)化點介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

南宫市| 马尔康县| 义马市| 仪陇县| 沧源| 靖远县| 定陶县| 织金县| 福建省| 东城区| 兰考县| 岳池县| 万全县| 阳谷县| 囊谦县| 定襄县| 阿拉善盟| 永修县| 桓仁| 昔阳县| 任丘市| 呼图壁县| 天柱县| 格尔木市| 沙坪坝区| 钟祥市| 贵溪市| 奈曼旗| 贵阳市| 德兴市| 达拉特旗| 姚安县| 三门峡市| 巴林右旗| 潼关县| 梅州市| 通榆县| 曲靖市| 鄂托克旗| 沾益县| 雷州市|