【问题标题】:type 'Future<File>' is not a subtype of type 'File''Future<File>' 类型不是 'File' 类型的子类型
【发布时间】:2021-02-04 05:35:13
【问题描述】:

重要提示:我搜索了很多,但没有找到任何我能理解的解决方案。 我正在使用照片管理器来显示图像,然后在选择图像后我想导航到下一个屏幕并在那里显示该图像(稍后我想将该图像上传到 Firebase 存储)。

所以我从 photo_manager 包中获取的文件类型是 Future ,我正在从第二个屏幕接收 File

如何将 future 转换为文件?

首屏:

IconButton(
        icon: const Icon(Icons.arrow_forward, color: primaryColor),
        onPressed: () {
          Get.to(PostDetail(
            imgFile:
                _controller.mediaList[_controller.selectedImageIndex].file,
          ));
        },
      ),

第二屏: 在第二个屏幕上,我正在获取文件。

final File imgFile;
  const PostDetail({this.imgFile});

源代码:Add Post Page

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    因此,如photo_manager 文档中所述,您需要先从 AssetEntity 列表中获取文件,然后再转到下一页。

    按下按钮转到下一页获取文件,然后将其传递给页面

    下面的代码应该可以工作:

     IconButton(
                icon: const Icon(Icons.arrow_forward, color: primaryColor),
                onPressed: () async {
                  File file = await _controller.mediaList[_controller.selectedImageIndex].file; // image file
                  Get.to(PostDetail(
                    imgFile: file,
                  ));
                },
              ),
    
    

    【讨论】:

    • 非常感谢,你让我在这个 bug 上多花一天时间,顺便说一句,这很容易,但有时我们会分心,甚至忘记解决问题是多么容易,
    • 哈哈,发生了 :)
    【解决方案2】:

    FileFuture&lt;File&gt; 是两个不同的东西。 File 是一个变量,它的值在当前。但是Future&lt;File&gt;顾名思义,它的价值存在于Future中,这意味着它的价值需要一些时间才能到达您的手中。

    例如,如果您向网络服务器发送请求,响应需要一些时间才能到达您的手中。因此,在这种情况下,响应是 Future。

    在您的情况下,您尝试获取的图像是以需要时间的方式提供的。要从Future&lt;File&gt; 获取File,您必须等待。因此,在将文件发送到此屏幕之前,请使用异步并等待将 Future&lt;File&gt; 转换为 File。 (我不知道你是怎么得到文件的)

    例如,

    File myFile = await getFileorWhaterver();
    

    【讨论】:

    【解决方案3】:

    您的_controller.mediaList[_controller.selectedImageIndex].fileFuture&lt;File&gt; 意味着File 的值承诺有时会在将来返回。这通常是因为您正在异步执行网络调用以从 API 获取数据。

    为了将其转换为File,您需要等待直到该值可用。但是你不能在 UI 中执行 async/await,这就是为什么 Flutter 提供了一个名为 FutureBuilder 的小部件来等待某个 Future 值,然后让你在 UI 中使用该值。

    在你的情况下,你可以这样做:

    FutureBuilder(
      future: _controller.mediaList[_controller.selectedImageIndex].file,
      builder: (context, snapshot) {
        return IconButton(
          icon: const Icon(Icons.arrow_forward, color: primaryColor),
          onPressed: () {
            if (snapshot.hasData)
              Get.to(PostDetail(imgFile: snapshot.data));
          },
        );
      })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2020-09-11
      • 2021-02-10
      • 1970-01-01
      • 2020-10-13
      • 2020-09-20
      • 2020-01-14
      相关资源
      最近更新 更多