Flutter Get 正确设置变量

Flutter Get setting variables properly

所以在终于学习了 flutter 和无状态和有状态之后,我慢慢地掌握了 GetX 包的使用方法 widgets.In 这个例子我试图了解如何在 GetX 中正确地创建和设置变量.所以我正在尝试检查权限,当我在一个方法中执行此操作时它起作用了...

var cameraStatus = await Permission.camera.status;

但我希望这个变量在 class 级别而不是在方法中,所以我尝试在方法上方像这样创建它...

var cameraStatus = Permission.camera.status.obs;

但是当我在方法中使用它时...

cameraStatus.value = await Permission.camera.status;

我收到错误消息“类型 'PermissionStatus' 的值无法分配给类型 'Future' 的变量。尝试更改变量的类型,或强制转换右侧的类型至 'Future'."

有人能告诉我应该如何正确地使用 Getx 创建变量吗?

请记住,仅仅因为您使用的是 Getx,并非所有内容都需要使用 .obs.

制作成可观察的流

虽然您可以使自定义对象可观察,但问问自己为什么需要这样做。通常会有更简单的方法来完成您的需要。

例如你这里有:

var cameraStatus = Permission.camera.status.obs;

就我个人而言,我认为将自定义 PermissionStatus 类型从外部包更改为可观察流没有任何价值。只需按照文档中显示的那样使用它。

如果你需要根据权限请求的结果重建一些东西,你可以使用Getx的GetBuilder或Flutter SDK的FutureBuilder

或者,如果您想使用 Obx 小部件,则根据权限更新 RxBool 的值,并从中重建您的 UI。就我个人而言,如果我有一个使用 GetX 的项目,我将使用 GetBuilder 来完成我需要的绝大多数 UI 更新。一旦您调用更新,它将根据任何类型的更改进行重建。

所有应用程序需要知道的是它是否具有权限的简单真或假。所以我的建议是保持简单。

class PermissionController extends GetxController {
  bool hasCameraPermission = false;

  Future<void> checkCameraPermission() async {
    final status = await Permission.camera.status;

    if (status == Permission.camera.isGranted) {
      hasCameraPermission = true;
      update(); // only needed if you're using GetBuilder widget
      return; // ending the function here because that's all you need.
    }

    if (status.isDenied) {
      await Permission.camera.request();
    }
    // ...continue to handle all the possible outcomes
    update();
  }
}

这也避免了您在此处因比较不相等的数据类型而产生的错误。

cameraStatus.value = await Permission.camera.status;

那么 UI 中任何依赖权限的部分都可能如下所示

GetBuilder<PermissionController>(
            builder: (controller) {
              return controller.hasCameraPermission ? SomeWidget() : SomeOtherWidget();
            },
          )