當一個 function/task 用迴圈(while/for/do-while)處理狀態機(state machine)時, 如下所述:
import 'dart:async';
int step = 0;
void functionTask( ) async {
for (int i = 0; i < loopMax; i++) {
switch(step) {
case 0: // ...
step ++;
break;
case 1: //...
step ++;
break;
// ...
// case n: step ++;
// break ;
default: step = 0;
break;
}
await Future.delayed(Duration(microseconds: 0)); // schedule, to run ASAP
if (step == 0) break;
}
return;
}
這樣的寫法會造成程序(thread)堵(blocking)在迴圈內, 如果用在 Flutter 平台(Platform)上, 將沒機會處理內部訊息(message queue), 導致 Widget 無法同步更新, 或者看不到畫面, 此外 StatefulWidget 管理狀態(state)時, 在 initState( ) 或是 build( ) 的 function/task 內是不能使用 async/await 的, 但可以註冊類同步(then)方式來運作, 搭配遞迴函式編寫方式移除迴圈, 同上述 function/task 的狀態機處理函式就能活動不停, 同步更新畫面, 直到結束:
import 'dart:async';
int step = 0;
Future<int> async_Task( ) async { // 非同步涵式
switch(step) {// 現在函式
case 0: // ...
step ++;
break;
case 1: //...
step ++;
break;
// ...
// case n: step ++;
// break ;
default: step = 0;
break
}
await Future.delayed(Duration(microseconds: 1000000)); // return the 'Future'.
// 未來函式 ...
return step ;// 未來函數, 接觸點
}
// ... in stateManagement class ...
void recursiveLoop( ) {// 類同步註冊: 接觸過往, 持續未來
async_Task( ) .then((result) {
if (result > 0) setState ( ( ) => recursiveLoop( ) );// 接序函式: 建新 widget, 更新畫面
});
}
@override void initState( ) {
super .initState( );
recursiveLoop( );
}
沒有留言:
張貼留言