Flutter_bloc

今天重點講一下bloc 蓬豁,百度一下 有關(guān)這方面的知識比較少氢妈,畢竟flutter剛剛出來半年多,我的項目里管理方式是用bloc的嚷掠,也有其它的管理方式捏检,主要看個人理解以及喜好,bloc 可以本地管理和全局管理不皆,加上能數(shù)據(jù)UI隔離贯城,方便后期維護,是一個不錯的選擇

flutter_bloc 是一個bloc第三方庫霹娄,這個庫很方便的讓你集成bloc模式能犯,這個庫結(jié)合了RXDart,先了解一下bloc 的模式吧

1,widget 觸發(fā)event 事件?

2犬耻,bloc 接收event 事件并作出邏輯處理

3 踩晶,并把邏輯處理結(jié)果給返回出來?

4,UI展示數(shù)據(jù)

其實它有點像mvvm ? 枕磁,Event只是出發(fā)事件渡蜻,并不能傳值,bloc 接收這個event计济,根據(jù)event去找到具體的方法去處理邏輯茸苇,之后把結(jié)果返回,如果再不明白沦寂,我舉個例子学密,我去飯店吃飯去告訴老板點一個大盤雞(這個是event),老板根據(jù)菜名找到具體的廚師(sink)凑队,廚師做好大盤雞(這是邏輯處理)之后告訴老板做好(state)老板把菜端上來(UI跟數(shù)據(jù)改變)

flutter_bloc 提供幾個api ?根據(jù)這幾個API 就可以快速搭建bloc

? ?BlocBuilder ? ?

? ?BlocProvider ??

? ?BlocProviderTree ?

? ?BlocListener ?

? ?BlocListenerTree?

BlocBuilder

有三個屬性?bloc ?condition ?builder

BlocBuilder(

bloc: ,這個添加bloc dart

condition: (previousState, currentState){ return true;},//可選默認返回true

builder: (BuildContext context, List state) {}state 返回數(shù)據(jù)

)则果。

BlocProvider

這個可以管理全局變量

BlocProvider(

bloc:,這個添加bloc dart 把這個bloc 傳遞其它字界面使用

child:LogIn(),子類

)

子widget 通過BlocProvider.of<LogBloc>(context) 獲取這個bloc

?如果涉及到push 可以通過這種模式傳遞

Navigator.push(context, new MaterialPageRoute(

builder: (Context)=>BlocProvider(

bloc:LogBloc(),

child:HomePage1(),

)));

BlocProviderTree

可以管理多個狀態(tài)

一個widget 涉及多個state 可以用它管理

BlocProviderTree(

? blocProviders: [

? ? BlocProvider<BlocA>(bloc: BlocA()),

? ? BlocProvider<BlocB>(bloc: BlocB()),

? ? BlocProvider<BlocC>(bloc: BlocC()),

? ],

? child: ChildA(),

)

介紹一下實踐

?做一個請求數(shù)據(jù),拿到數(shù)據(jù)并展示UI

創(chuàng)建幾個widget漩氨。ceshiBlocName ??CeshiEvent ?西壮,CeshiModel ?,?CeShiState

CeshiEvent

負責觸發(fā)邏輯處理

import 'ceshimodel.dart';

abstract class CeShiState{}

class CeshiSateNullInstallextends CeShiState{}

class CeshiStateDataextends CeShiState{

final Listarry;

? ? CeshiStateData({this.arry});

? ? CeshiStateDatacopyWith({

? ? ? ?List arry,

? ? }) {

? ? ?return CeshiStateData(

? ? ? arry: arry ??this.arry,

? ? ? );

? ? }

}

CeshiModel

數(shù)據(jù)模型

class CeshiModel{

final Stringtitle;

? final Stringsource;

? final intreplyCount;

? final Stringtas;

? final Stringboardid;

? final Stringimgsrc;

? final Listimgnewextra;

? CeshiModel({this.title,this.source,this.replyCount,this.tas,this.boardid, this.imgsrc, this.imgnewextra});

}

ceshiBlocName

bloc 處理

Bloc<event,state> state可以對象叫惊,也可以是數(shù)組或者其它

CeshiEvent 是event

List<CeshiModel> 返回數(shù)據(jù)

class ceshiBlocNameextends Bloc<CeshiEvent,List<CeshiModel>>{

int_index=0;

? Listarry=new List();

? @override

? // TODO: implement initialState

? Listget initialState =>new List();//初始化結(jié)果

? @override

? Stream<List<CeshiModel>>mapEventToState(CeshiEvent event)async*{//數(shù)據(jù)處理 必須在這里面處理邏輯

event 觸發(fā)事件

// TODO: implement mapEventToState

? ? if(eventis CeshiLodale){//判斷事件并返回處理結(jié)果

final posts =await _fetchPosts(_index, 20);

? ? ? yield? posts;//yield 返回數(shù)據(jù)

? ? }

}

void ceshiDispachNull(){

dispatch(CeshiIntall());

? }

void ceshiDispach(){

dispatch(CeshiLodale());

? }

void ceshiDispach1(){

print('1111111111');

? ? dispatch(CeshiLodale1());

? }

Future>_fetchPosts(int startIndex, int limit)async {//請求數(shù)據(jù)

var tip=await NetUtil().request('${Url.listStr}offset=${startIndex}&size=${limit}&fn=2&spestr=reader_expert_1');

? ? List tipArry=tip['tid'];

? ? return tipArry.map((rawPost) {

return CeshiModel(

title:rawPost['title'],

? ? ? ? replyCount:rawPost['replyCount'],

? ? ? ? tas:'124' ,

? ? ? ? source: rawPost['source'],

? ? ? ? boardid: rawPost['boardid'],

? ? ? ? imgsrc: rawPost['imgsrc'],

? ? ? ? imgnewextra: rawPost['imgnewextra'],

? ? ? );

? ? }).toList();

? }

}

主Main里面

final ceshiBlocName_ceshiBloc=ceshiBlocName();

Widgetbuild(BuildContext context) {

return Scaffold(

? ? appBar:AppBar(

? ? ? ? ? title:Text('1123'),

? ? ),

? ? body:BlocBuilder(

? ? bloc:_ceshiBloc,//根據(jù)具體bloc 處理數(shù)據(jù)

? ?condition: (previousState, currentState){

return true;

? ? },

? builder: (BuildContext context, List state) {

//state 返回的數(shù)據(jù)

return ?widget;

?}

);

到這里已經(jīng)介紹完了款青,bloc 模式就是這種創(chuàng)建方式,通過例子可以看到數(shù)據(jù)與UI已經(jīng)隔離霍狰,方便后期維護抡草,大大節(jié)約維護成本饰及,跟大家留一個小作業(yè)????還有兩個沒有講,大家可以自己去查查康震,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腿短,隨后出現(xiàn)的幾起案子屏箍,更是在濱河造成了極大的恐慌,老刑警劉巖橘忱,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴魁,死亡現(xiàn)場離奇詭異,居然都是意外死亡钝诚,警方通過查閱死者的電腦和手機颖御,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凝颇,“玉大人潘拱,你說我怎么就攤上這事∑碓耄” “怎么了泽铛?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辑鲤。 經(jīng)常有香客問我盔腔,道長,這世上最難降的妖魔是什么月褥? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任弛随,我火速辦了婚禮,結(jié)果婚禮上宁赤,老公的妹妹穿的比我還像新娘舀透。我一直安慰自己,他們只是感情好决左,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布愕够。 她就那樣靜靜地躺著,像睡著了一般佛猛。 火紅的嫁衣襯著肌膚如雪惑芭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天继找,我揣著相機與錄音遂跟,去河邊找鬼。 笑死,一個胖子當著我的面吹牛幻锁,可吹牛的內(nèi)容都是我干的凯亮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼哄尔,長吁一口氣:“原來是場噩夢啊……” “哼假消!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岭接,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤置谦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亿傅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瘟栖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年葵擎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片半哟。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酬滤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寓涨,到底是詐尸還是另有隱情盯串,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布戒良,位于F島的核電站体捏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏糯崎。R本人自食惡果不足惜几缭,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沃呢。 院中可真熱鬧年栓,春花似錦、人聲如沸薄霜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惰瓜。三九已至否副,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸵熟,已是汗流浹背副编。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹届。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓呻待,卻偏偏與公主長得像,于是被迫代替她去往敵國和親队腐。 傳聞我的和親對象是個殘疾皇子蚕捉,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容