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();
},
)
所以在终于学习了 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();
},
)