如何从存储中选择多个图像并在 Flutter 和 Flutter Web App 中显示? [关闭]

Posted

技术标签:

【中文标题】如何从存储中选择多个图像并在 Flutter 和 Flutter Web App 中显示? [关闭]【英文标题】:How to Select Multiple Images from Storage and display it in both Flutter and Flutter Web App? [closed] 【发布时间】:2020-12-20 06:16:50 【问题描述】:

我正在开发这个 Flutter 应用程序,它允许用户从本地存储中选择多个图像进行上传。选择图像后,它会显示所有图像的预览。

我可以为移动 Flutter 应用程序实现这一点,但我还需要以 Flutter Web 为目标,而这不适用于 Flutter Web。我使用了这个plugin,因为它也允许为 Flutter web 选择多个文件,但它返回的 List<html.File> 不允许我读取图像字节以在 UI 中显示它。

我需要一个解决方案:

允许选择多个图像 也适用于颤振网络 允许访问图像字节数据,以便我可以显示它们的预览

【问题讨论】:

【参考方案1】:

您可以在下面复制粘贴运行完整代码 在此拉取请求合并之前https://github.com/miguelpruivo/flutter_file_picker/pull/328/files/3e23d4e9977451d4e84f54a155ac1b2a951cd7fe 代码sn-p

Future<List<int>> fileAsBytes(html.File _file) async 
    final Completer<List<int>> bytesFile = Completer<List<int>>();
    final html.FileReader reader = html.FileReader();
    reader.onLoad.listen((event) => bytesFile.complete(reader.result));
    reader.readAsArrayBuffer(_file);
    return await bytesFile.future;
  
  
ListView.separated(
        itemBuilder: (BuildContext context, int index) =>
            Column(
          children: [
            FutureBuilder<List<int>>(
                future: fileAsBytes(_files[index]),
                builder: (context, snapshot) => snapshot.hasData
                    ? Image.memory(snapshot.data)
                    : CircularProgressIndicator()),
            Text("name $_files[index].name"),
          ],
        ),

工作演示 选择两个图像文件并显示,不要检查文件类型是图像

完整代码

// ignore: avoid_web_libraries_in_flutter
import 'dart:async';
import 'dart:html';
import 'package:file_picker_web/file_picker_web.dart';
import 'package:flutter/material.dart';
import 'dart:html' as html;

void main() 
  runApp(MyApp());


class MyApp extends StatefulWidget 
  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 
  List<html.File> _files = [];

  Future<List<int>> fileAsBytes(html.File _file) async 
    final Completer<List<int>> bytesFile = Completer<List<int>>();
    final html.FileReader reader = html.FileReader();
    reader.onLoad.listen((event) => bytesFile.complete(reader.result));
    reader.readAsArrayBuffer(_file);
    return await bytesFile.future;
  

  void _pickFiles() async 
    _files = await FilePicker.getMultiFile() ?? [];
    setState(() );
  

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Expanded(
                child: _files.isNotEmpty
                    ? ListView.separated(
                        itemBuilder: (BuildContext context, int index) =>
                            Column(
                          children: [
                            FutureBuilder<List<int>>(
                                future: fileAsBytes(_files[index]),
                                builder: (context, snapshot) => snapshot.hasData
                                    ? Image.memory(snapshot.data)
                                    : CircularProgressIndicator()),
                            Text("name $_files[index].name"),
                          ],
                        ),
                        itemCount: _files.length,
                        separatorBuilder: (_, __) => const Divider(
                          thickness: 5.0,
                        ),
                      )
                    : Center(
                        child: Text(
                          'Pick some files',
                          textAlign: TextAlign.center,
                        ),
                      ),
              ),
              Padding(
                padding: const EdgeInsets.all(15.0),
                child: RaisedButton(
                  onPressed: _pickFiles,
                  child: Text('Pick Files'),
                ),
              )
            ],
          ),
        ),
      ),
    );
  

【讨论】:

以上是关于如何从存储中选择多个图像并在 Flutter 和 Flutter Web App 中显示? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 Multi Image Picker 选择图像后如何获取图像路径?

如何在通过共享扩展选择的 NSUserDefaults 中存储多个图像

Flutter - 将图像上传到 Firebase 存储

如何在Flutter中选择和上传多张图像

如何将图像从颤动的资产上传到firebase存储?

Flutter- 图像选择器包:通过删除操作一张一张地显示图像