📜  pop 和 push 显示黑屏需要回按 flutter - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:33:44.026000             🧑  作者: Mango

使用 pop 和 push 出现黑屏问题需要回按 Flutter -C 编程语言

问题描述

Flutter 开发中,当使用 Navigator.pushNavigator.pop 进行页面跳转时,有时出现黑屏的情况,需要通过回退处理才能正常显示。这个问题在 Flutter 1.7 版本中被部分解决,但是仍然有可能在某些情况下出现。

问题分析

在使用 Navigator.pushNavigator.pop 进行页面跳转时,Flutter 中的算法会尝试在 UI 线程中运行动画,这会造成一定程度上的 UI 阻塞,导致黑屏或卡顿等问题。

而回退则会使得 UI 线程重新回到 Flutter 引擎中,从而消除了该问题。

解决办法
解决方案 1:使用 async / await 进行页面跳转

我们可以将 Navigator.pushNavigator.pop 转为异步操作,然后使用 async / await 进行页面跳转。

Future<void> _navigateToNextScreen() async {
  await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => NextScreen()),
  );
}

在这个例子中,我们使用 async / await 关键字将 Navigator.push 方法转为异步方法,然后使用 await 等待页面跳转结果。

请注意,这种方法仅在单次页面跳转的情况下有效。如果在同一时刻进行多次页面跳转,这种方法仍然无法避免出现黑屏问题。

解决方案 2:使用 SchedulerBinding.addPostFrameCallback 进行页面跳转

SchedulerBinding.addPostFrameCallback 方法允许我们在下一帧绘制前执行一个回调函数,从而避免 UI 线程阻塞。

void _navigateToNextScreen() {
  WidgetsBinding.instance.addPostFrameCallback((_) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => NextScreen()),
    );
  });
}

在这个例子中,我们使用 addPostFrameCallback 方法将 Navigator.push 方法封装起来,当下一帧绘制前执行该方法,从而避免了 UI 线程阻塞问题。

解决方案 3:使用 Future.delayed 进行页面跳转

我们可以在页面跳转前添加一个轻微延时来避免阻塞。

void _navigateToNextScreen() {
  Future.delayed(Duration(milliseconds: 16), () {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => NextScreen()),
    );
  });
}

在这个例子中,我们使用 Future.delayed 方法添加了一个轻微延时,然后在跳转前执行 Navigator.push 方法。

这种方法适用于次数较少的页面跳转,但如果连续多次页面跳转,这种方法同样无法解决该问题。

总结

出现黑屏问题通常是由于 UI 线程在执行动画时出现阻塞导致的。为避免此类问题,我们可以使用 async / awaitSchedulerBinding.addPostFrameCallbackFuture.delayed 等方法对页面跳转进行优化。

在实际开发中,我们需要考虑应用程序中的页面跳转次数以及应用程序的性能等因素来选择合适的解决方案。