我在顫振應用程式中有兩個頁面。即使我移動到第二頁(使用 navigator.push),計時器仍然在后臺運行。(我知道是因為我也在終端列印它)。另外,我已經嘗試在 dispose 方法中取消我的 Timer。這沒用。另外,如果我使用navigator.pushReplacement,它可以解決 Timer 在后臺運行的問題,但我將無法回傳此頁面。
這是我的完整代碼:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:provider_2_practice/controller/controller_file.dart';
import 'new_screen.dart';
class MyHomePageUI extends StatefulWidget {
@override
State<MyHomePageUI> createState() => _MyHomePageUIState();
}
class _MyHomePageUIState extends State<MyHomePageUI> {
Timer? timer ;
String abc ='df-1'; //default value: 'df-1'
@override
void initState() {
// TODO: implement initState
super.initState();
timer = Timer.periodic(Duration(seconds: 1), (Timer t) {
if(mounted){
setState( () {
abc = DateFormat('hh:mm:ss a').format(DateTime.now());
} );
}
print(abc);
});
}
@override
void dispose() {
// TODO: implement dispose
print('test \n if you are seeing this, maybe you used Navigator.pushReplacement()');
timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightBlue[900],
floatingActionButton: FloatingActionButton(
onPressed: (){
dispose();
// Provider . of <MyController> (context, listen: false) . addItemInList();
Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewScreen()));
/*MyController con = MyController();
con.addItemInList();*/
},
child: Icon(Icons.add, color: Colors.white),
backgroundColor: Colors.blue,
),
body: Column(
children: [
SizedBox(height:100,),
Text(abc, style: TextStyle(fontSize: 45, fontWeight: FontWeight.bold,color: Colors.white70),),
Text('current time', style: TextStyle( fontWeight: FontWeight.bold,color: Colors.white),),
],
),
);
}
}
uj5u.com熱心網友回復:
dispose方法僅在頁面完成并準備從 中洗掉時呼叫WidgetTree,在第一種情況下,當您使用Navigator.push導航到另一個頁面時,它不會洗掉上一頁并Navigator.pushReplacement替換第一頁并將其從小部件樹中洗掉呼叫dispose方法。
所以,要在回到第一頁后暫停和恢復,那么你需要在它完成之前取消計時器navigator.push,await直到它完成并在異步完成后恢復
void goToSecondpage () async {
timer?.cancel();
await Navigator.of(context).push(
MaterialPageRoute(builder: (context) => SecondWidget()));
initTimer();
}
完整代碼在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529321.html
標籤:扑镖计时器
下一篇:Deno遇到意外的內部錯誤
