問題
我在聊天。如果沒有訊息,我希望程式每 5 秒嘗試再次獲取訊息。
我的解決方案
我在我的有狀態小部件中創建了一個計時器。
Timer timer;
當我構建一個小部件時,我會檢查訊息。如果沒有,我啟動計時器。我希望計時器在下一次檢查時停止,以防出現現有訊息
void onBuild() {
if (state.messages.isEmpty) {
_checkEmptyMessages();
timer = Timer.periodic(
Duration(seconds: 5), (Timer t) => _checkEmptyMessages());
}
}
void _checkEmptyMessages() {
print('MES789 ${state.messages.isEmpty}');
if (state.messages.isEmpty) {
add(ChatEventLoadFirstPage()); // This adds an event to the BLoC
} else {
if (timer != null) timer.cancel();
timer = null;
}
}
我也試過
我試著洗掉timer = null;和等待的timer.cancel();,但它并沒有幫助。
實際產量
所以在除錯控制臺中,我每 5 秒收到一次:
I/flutter (13387): MES789 false
I/flutter (13387): MES789 false
I/flutter (13387): MES789 false
I/flutter (13387): MES789 false
題
如何停止計時器?
uj5u.com熱心網友回復:
這段代碼是死代碼,它永遠不會作業,因為你if (state.messages.isEmpty)之前_checkEmptyMessages()并if (state.messages.isEmpty)再次嘗試先移除if (state.messages.isEmpty)
uj5u.com熱心網友回復:
因為 'Timer.periodic' 被呼叫,新的 Timer 實體被創建并存盤相同的計時器變數。
這意味著在呼叫 'Timer.periodic' 時,未取消的計時器實體將丟失。
所以你需要檢查 Timer 實體是否存在。
void onBuild() {
if (state.messages.isEmpty) {
if (timer == null) {
timer = Timer.periodic(
Duration(seconds: 5), (Timer t) => add(ChatEventLoadFirstPage()));
}
} else {
if (timer != null) timer.cancel();
timer = null;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/330994.html
