【问题标题】:Rebuild a FutureBuilder重建 FutureBuilder
【发布时间】:2020-05-14 21:51:01
【问题描述】:

我正在尝试重建 FutureBuilder,在我的情况下,它是为了更改向用户显示的相机。为此,我必须运行 Future,FutureBuilder 再次使用。 未来目前看起来像这样:

body: FutureBuilder(
        future: _initializeCameraControllerFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return CameraPreview(_cameraController);
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),

它正在运行的未来是这个:

Future<void> _initializeCameraControllerFuture;
  @override
  void initState() {
    super.initState();

    if (camerafrontback != true) {
      _cameraController =
          CameraController(widget.camera[0], ResolutionPreset.veryHigh);
    }else{
      _cameraController =
          CameraController(widget.camera[1], ResolutionPreset.veryHigh);
    }
    _initializeCameraControllerFuture = _cameraController.initialize();
  }

我有一个按钮可以触发 FutureBuilder 的重建,它还更改了“camerafrontback”布尔值,以便使用不同的相机。如下图:

IconButton(
            onPressed: () async {
              if (camerafrontback == true){
                setState(() {
                  camerafrontback = false;
                });
              }else{
                setState(() {
                  camerafrontback = true;
                });
              };

            },

最后,在最后一个括号之前,必须添加一个触发整个 FutureBuilder 重建的语句,但我找不到适合我的代码的语句。

提前感谢您的回答!

【问题讨论】:

  • 似乎仅仅触发FutureBuilder 的重建就可以解决您的问题。据我所知,仅更改 camerafrontback 的值似乎并没有做任何我们期望相机发生变化的事情。
  • 链接camerafrontback 的作用是在Future 中将相机从camera[0] 更改为相机camera[1],或者使用if 声明的其他方式
  • 在您的原始代码中,检查变量的唯一位置是initState,因此即使更改了变量,也无需检查并更改相机控制器,除非您处理并重新初始化整个小部件。
  • @ChristopherMoore 是的,那这就是我必须做的,那么解决方法是什么?
  • @AjayKumar 的回答已经这样做了。除了在initState 期间,他还调用了他在按钮的onPressed 中创建的_init 方法。

标签: flutter dart future rebuild


【解决方案1】:

你需要重新初始化_initializeCameraControllerFuture

你可以这样做

  @override
  void initState() {
    super.initState();
    _init();
  }

  ...


  _init() {
    if (camerafrontback) {
        _cameraController =
          CameraController(widget.camera[1], ResolutionPreset.veryHigh);

    } else {
         _cameraController =
          CameraController(widget.camera[0], ResolutionPreset.veryHigh);
    }
    _initializeCameraControllerFuture = _cameraController.initialize();
  }


  ...


  IconButton(
  onPressed: () async {
           if (camerafrontback) {
              camerafrontback = false;
              setState(_init());
      } else {
            camerafrontback = true;
             setState(_init);
             }
           },
         ),

【讨论】:

  • 我与FutureBuilder 有什么关系吗?因为相机被激活,但屏幕上没有显示预览。
  • 遇到类似问题如何让未来的构建器在状态改变后重新加载
【解决方案2】:

要完全重建您的屏幕,您只需将屏幕替换为相同的屏幕

Navigator.pushReplacement(context,
  MaterialPageRoute(
    builder: (BuildContext context) =>
       *SamePage*()
  )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2020-08-23
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多