Ffltter Future<bool&>;,RX<bool&>;和规则的bool混淆,以及如何从一个获得另一个的价值 [英] Flutter Future<bool>, RX<bool>, and regular bool confusion and how to get the value of one from the other

查看:11
本文介绍了Ffltter Future<bool&>;,RX<bool&>;和规则的bool混淆,以及如何从一个获得另一个的价值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我还是个初学者,刚刚了解了GetX,所以我正试图将它尽可能地整合到我的应用程序中。在本例中,我尝试获取存储权限,并在小工具被授予或未被授予更改文本和颜色等权限时对其进行响应。

我的调用存储权限的函数返回这样的未来...

  Future<bool> requestStoragePermissions() async {
    final storagePermissionStatus = await Permission.storage.request();

    if (storagePermissionStatus == PermissionStatus.granted) {
      debugPrint('Notification Permission Granted');
      return true;
    } else if (storagePermissionStatus == PermissionStatus.denied) {
      debugPrint('Notification Permission Denied');
    } else if (storagePermissionStatus == PermissionStatus.permanentlyDenied) {
      debugPrint('Notification Permission Permanently Denied');
      await openAppSettings();
    }

    if (storagePermissionStatus == PermissionStatus.granted) {
      return true;
    } else {
      return false;
    }
  }

在我的权限屏幕中,我有一个方法可以根据发送到类中的参数来选择我想要的权限...

Future<bool> checkPermissions() async {
  print('Permission Type: ' + permissionType.toString());
  bool statusGranted = false;
  if (permissionType == Permission.camera) {
    statusGranted = await _permissionController.requestCameraPermission();
  } else if (permissionType == Permission.location) {
    statusGranted = await _permissionController.requestLocationPermissions();
  } else if (permissionType == Permission.notification) {
    statusGranted = await _permissionController.requestNotificationPermissions();
  } else if (permissionType == Permission.storage) {
    statusGranted = await _permissionController.requestStoragePermissions();
  }
  return Future<bool>.value(statusGranted);
}

我更改了返回到未来的状态,但我确实拥有它,就像我在玩它一样。如何在条件语句中使用值Future?我一直收到错误,我不能将未来与布尔进行比较。

在这里,我尝试根据是否授予权限,有条件地将按钮图标设置为不同。

SizedBox(
  width: 100,
  child: _permissionGranted.value == false
      ? const Icon(
          Icons.no_photography,
          size: 40,
          color: Colors.red,
        )
      : const Icon(
          Icons.camera_alt,
          size: 40,
          color: Colors.green,
        ),
),

我在其中放入的_permissionsGranted.值,因为我一开始在那里有检查权限()==Falsa。现在,我只是在尝试随机的事情,并进一步偏离我需要的地方,这就是我来这里寻求帮助的原因。

正如标题所说的那样,在边注上。现在我们有三个不同的BOB可以一起工作。有没有一种适当的方式来交替使用它们?

编辑:

每次按下此按钮时都会检查检查权限...

Obx(
    () => ElevatedButton(
      child: _permissionGranted.value == false ? const Text('Click Me') : const Text('Done'),
      onPressed: _permissionGranted.value == false
          ? () async {
              await checkPermissions();
            }
          : null,

我基本上是在我的屏幕小工具中创建此按钮,并决定将其提取到它自己的小工具中,这样我就可以使用更多相同的按钮来检查同一页面上的不同权限检查。

推荐答案

如果您对Futures感到困惑,那么我建议您将async programming in Dart 作为一个需要理解的重要概念来阅读。它是Future,因为它必须在bool的值设置之前await检查权限的进程。

任何类型的Future只是表示在发生其他进程之前不会返回值,例如...从某个外部API请求数据或检查权限等...

RxBoolvsboolbooleanvs常规boolean的流。使用Obx需要在它内部有一个流,因为它的工作是监听流并在流的值更新时重新构建。如您所知,要访问实际的原语bool,您可以使用.value

在您的例子中,您的屏幕中有一堆逻辑,这些逻辑都可以驻留在GetX类中并清理您的UI代码。用户界面应该关心的只是controller.permissionGranted

的值

您的Future<bool> checkPermissions()不需要返回bool,只需更新permissionGranted的值。所有其他函数都可以是私有的,因为用户界面不需要知道checkPermissions()做了什么。

// all of this lives in the GetX class
  Future<void> checkPermissions() async {
    if (permissionType == Permission.camera) {
      permissionGranted.value = await _requestCameraPermission();
    } else if (permissionType == Permission.location) {
      permissionGranted.value = await _requestLocationPermissions();
    } // continue with others...
  }

这是一个如何在用户界面中显示的示例

class TestPage extends StatelessWidget {
  final controller = Get.find<PermissionController>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Obx(
          () => ElevatedButton(
              child: !controller.permissionGranted
                      .value // note the ! saves from having to write "== false"
                  ? const Text('Click Me')
                  : const Text('Done'),
              onPressed: !controller.permissionGranted.value
                  ? () async {
                      await controller.checkPermissions();
                    }
                  : null),
        ),
      ),
    );
  }
}

这篇关于Ffltter Future&lt;bool&>;,RX&lt;bool&>;和规则的bool混淆,以及如何从一个获得另一个的价值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆