Flutter:取消处理中的计时器不工作

Zef*_*ndo 2 dart flutter

我已经使用计时器和以下代码创建了运行时钟:

源代码


class LiveClock extends StatefulWidget {
  @override
  _LiveClockState createState() => _LiveClockState();
}

class _LiveClockState extends State<LiveClock> {
  String _timeString;
  String _dateString;

  Timer _timerClock;

  String _formatTime(DateTime dateTime) => DateFormat.Hms().format(dateTime);
  String _formatDate(DateTime dateTime) =>
      DateFormat.yMMMMEEEEd(appConfig.indonesiaLocale).format(dateTime);

  @override
  void initState() {
    super.initState();
    _timeString = _formatTime(DateTime.now());
    _dateString = _formatDate(DateTime.now());
    _timerClock = Timer.periodic(Duration(seconds: 1), _getTime);
  }

  @override
  void dispose() {
    _timerClock.cancel();
    super.dispose();
  }

  void _getTime(Timer timer) {
    final DateTime now = DateTime.now();
    final String formattedTime = _formatTime(now);
    setState(() => _timeString = formattedTime);
  }

  @override
  Widget build(BuildContext context) {
    print('This Rebuild');

    return Text(
      '$_dateString $_timeString ',
      textAlign: TextAlign.center,
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

结果

但问题是,如果我导航到另一个屏幕,尽管我已经处理了计时器,但计时器仍在运行。

在此输入图像描述

我犯了错误还是计时器的行为?

bha*_*anu 5

在 flutter 中,当 widget 从父树中完全删除时,会调用 dispose。

在flutter中使用路线(导航)时。

  • 使用推送导航,可以在当前屏幕的顶部添加一个新屏幕。因此(旧屏幕的)树没有完全被破坏,因此不会调用 dispose 。

  • 使用流行音乐。屏幕被移除,树也被移除。因此称为 dispose。

  • 使用推送替换。新屏幕替换旧屏幕并删除小部件树。所以调用了dispose。

希望这可以帮助