昨天有一個需求,要寫一個驗證碼倒計時律秃,其實這個比較好寫滴爬橡,但是如果直接在當(dāng)前頁面直接開干的話,會增加界面臃腫棒动,增加閱讀時間糙申,不好管理,本文就倒計時與flutter_bloc 結(jié)合講解一下船惨,個人感覺還是可以滴柜裸,??????走起
需求: 點擊按鈕 倒計時60開始,中間不能點擊按鈕粱锐,直到結(jié)束為止疙挺,
1,創(chuàng)建bloc.dart, 使用bloc(不會滴可以去百度或者看前面幾篇文章)ok
2怜浅,創(chuàng)建事件event ?
3铐然,創(chuàng)建繼承bloc 類,
4海雪,根據(jù)需求知道我們需要一個數(shù)據(jù)锦爵,跟一個bool值,這時state 可以是一個字典啦
5奥裸, 創(chuàng)建一個定時器去發(fā)送事件,跟算法
下面是完整封裝方法
abstract class Event {
}
class CountEventextends Event{
@override
? StringtoString() {
// TODO: implement toString
? ? return 'CountEvent';
? }
}
class CoundBlocextends Bloc<Event,Map>{
Timer_countdownTimer;
? int_count;
? @override
? // TODO: implement initialState
? Mapget initialState {
Map schoolsMap =new Map();
? ? schoolsMap['count'] ='重新獲取';
? ? schoolsMap['click'] ='true';
? ? return schoolsMap;
? }
void startOpen(){
_count=60;
? ? ? _countdownTimer=null;
? ? ? _countdownTimer =
new Timer.periodic(new Duration(seconds:1), (timer) {
if(_count==0){
_countdownTimer.cancel();
? ? ? ? }else
? ? ? ? {
_count--;
? ? ? ? ? dispatch(CountEvent());
? ? ? ? }
});
? }
@override
? void dispose() {
// TODO: implement dispose
? ? _countdownTimer?.cancel();
? ? _countdownTimer=null;
? ? super.dispose();
? }
@override
? StreammapEventToState(Event event)async* {
// TODO: implement mapEventToState
? ? if(eventis Event){
Map schoolsMap =new Map();
? ? ? schoolsMap['count'] ='${_count==0?'重新獲取':'重新獲取(${_count})'}';
? ? ? if(_count==0){
schoolsMap['click'] ='true';
? ? ? }else {
schoolsMap['click'] ='flase';
? ? ? }
yield schoolsMap;
? ? ? return ;
? ? }
}
}