class _HomeState extends State<Home> {
  @override
  void initState() {
    super.initState();
    checkPermission();
  }

  final audioQuery = OnAudioQuery();
FutureBuilder<List<SongModel>>(
        future: audioQuery.querySongs(
          sortType: null,
          orderType: OrderType.ASC_OR_SMALLER,
          uriType: UriType.EXTERNAL,
          ignoreCase: true,
        ),

Future<void> checkPermission() async {
    if (!kIsWeb) {
      bool permissionRequest = await audioQuery.permissionsRequest();

      setState(() {});
    }
  }

我试图使用音频查询以下教程在youtube上,但我有错误,audioQuery.querySongs()是execute之前,用户给一个权限.

然后try 添加权限判断,如下所示:

Future<void> checkPermission() async {
    if (!kIsWeb) {
      bool permissionStatus = await audioQuery.permissionsStatus();
       if (!permissionStatus) {
         await audioQuery.permissionsRequest();
       }

      setState(() {});
    }
  }

但这并不管用.我的DEBUGE CONSOLE说:

**W/le.music_playe(29628): Accessing hidden method Landroid/content/ContextWrapper;->getDisplay()Landroid/view/Display; (light greylist, linking)
W/OnAudioQueryPlugin(29628): The application doesn't have access to the library
E/AndroidRuntime(29628): FATAL EXCEPTION: main**

第一个警告意味着显示弹出窗口以访问存储,但在popup show次警告后,我的应用程序崩溃.我认为这是因为audioQuery.querySongs()在用户许可之前就执行了.

那么如何使该函数等待直到checkPermission()完成.我正在try 使用Future.wait(),但我不明白这样做.请帮助我解决这个问题,谢谢.

推荐答案

只需创建一个变量来保存权限,并有条件地呈现FutureBuilder

class _HomeState extends State<Home> {
  ...
  bool hasPermission = false;

在该函数中,类似于:

Future<void> checkPermission() async {
  if (!kIsWeb) {
    bool permissionStatus = await audioQuery.permissionsStatus();
    if (!permissionStatus) {
      permissionStatus = await audioQuery.permissionsRequest();
    }

    setState(() {
      hasPermission = permissionStatus; // --> update it here..
    });
  }
}

然后:

@override
Widget build(BuildContext context) {
  return Scaffold(
    ...
    hasPermission
      ? FutureBuilder<List<SongModel>>(
          future: audioQuery.querySongs(
          
          ),
          builder: (context, snapshot) {
          },
        )
      : Center(child: Text("No permissions"))
  );
}

顺便说一句,您不应该在future参数内实例化future ,因为只要您的build方法重新绘制,它就会重新运行.请参阅:

Flutter相关问答推荐

Flutter 数独网格

为什么用户界面不会在Flight中的复选框中更改?

Flutter:我的应用程序是否需要包含退款购买?

自定义类提供程序 Riverpod Flutter 中的可变变量

要禁用按钮上的通知声音,请点击Flutter

Flutter 中的区域不匹配

点击后,将按钮的 colored颜色 禁用/更改一段时间

用户文档 ID 与 Firestore 中的用户 ID 相同

当我使用 Confetti Widget 时,Flutter Android 和 IOS 应用程序崩溃

Cloud firestore:如何使用 map 对象创建和更新嵌套数组

如何在 GridView.builder 中设置 textform 字段并在 flutter 中将 12 个 textformfield 作为单个字符串获取?

将 String 与 List 元素进行比较时出现问题

在 Flutter 中使用 HardwareKeyboard 时所有键都没有响应

Flutter中如何连续获取TextField的文本是否为空?

Flutter Serverpod 在示例项目上返回 400 错误

如何在椭圆形图像周围添加边框?Flutter

Flutter 中父容器顶部的 Gridview 间距额外区域

使用 hydrad_bloc 的预览包

Textfield 和 MasonryGrid 给出错误(垂直视口的高度没有限制)

Flutter 评级栏包选中和未选中的容器