使用getX时,在构建期间调用FlutterError(setState()或markNeedsBuild()?

mnemlml8  于 2023-11-21  发布在  Flutter
关注(0)|答案(1)|浏览(153)

我有一个计时器控制器:

class TimerController extends GetxController {
  int secondsRemaining = 5;

  late Timer timer;
  void startTimer() {
    timer = Timer.periodic(Duration(seconds: 1), (Timer t) {
      secondsRemaining--;
      update();
      // Check if the timer has reached 0
      if (secondsRemaining <= 0) {
        // Stop the timer when it reaches 0
        stopTimer();
      }
    });
  }

  void stopTimer() {
    timer.cancel();
  }
}

字符串
然后我在PageA中初始化控制器:

class _PageAState extends State<PageA> {
  TimerController timerController =
      Get.put(TimerController());
}


然后我按到PageB

Get.to(() => PageB());
class _PageBState extends State<PageB> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
    body: GetBuilder<TimerController>(builder: (controller) {
                      if (controller.secondsRemaining == 0) {
                        //error here!
                        Get.back();
                      }
                      return Text('${controller.secondsRemaining}s',
                          textAlign: TextAlign.right);
                    }),
  );
  }
}

的字符串
它在调用Get.back()时崩溃,原因是在构建期间调用了FlutterError(setState()或markNeedsBuild()**。
这怎么解决?!

9rnv2umw

9rnv2umw1#

在构建过程中,调用setState()再次调用重建是不合适的。这会导致你得到的错误。
您可以使用不同的方法来调用Get.back();,将其从构建方法中取出,或者如果需要在该点调用它,则必须使用类似于此的方法(代码如下),该方法允许您在构建过程完成后通过WidgetsBinding.instance.addPostFrameCallback注册Callable。

typedef ActionAfterBuild = void Function();

class _PageBState extends State<PageB> {
  ActionAfterBuild? actionAfterBuild;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GetBuilder<TimerController>(builder: (controller) {
        if (controller.secondsRemaining == 0) {
          //error here!
          actionAfterBuild = Get.back();
        }
        return Text('${controller.secondsRemaining}s', textAlign: TextAlign.right);
      }),
    );
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (mounted && actionAfterBuild != null) {
        actionAfterBuild!.call();
        actionAfterBuild = null;
      }
    });
  }
}

字符串

相关问题