前言

学习flutter,其中用Futere.delayed延时1s跳转到其他页面的时 如果没跳转前离开当前页面就会报

Future.delayed(const Duration(seconds: 1), () {
  Navigator.of(context).pushNamed("");
});
//报错
This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
    Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.

问题分析

说明其实很清楚了,就是widget已经unmounted 不能跳转,我们需要在dispose取消下Future,所以需要看下delayed的源码:

  factory Future.delayed(Duration duration, [FutureOr<T> computation()?]) {
    _Future<T> result = new _Future<T>();
    new Timer(duration, () {
      if (computation == null) {
        result._complete(null as T);
      } else {
        try {
          result._complete(computation());
        } catch (e, s) {
          _completeWithErrorCallback(result, e, s);
        }
      }
    });
    return result;
  }

发现其实内部用是Timer实现,返回的_Future并找到对应方法取消,干脆直接用Timer实现好了,注意还是需要dispose取消

    _timer = Timer(const Duration(seconds: 1), () {
      Navigator.of(context).pushNamed("");
    });
    
	  @override
	  void dispose() {
	    super.dispose();
	    _timer?.cancel();
	  }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐