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

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

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

我需要一个解决方案:

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

【问题讨论】:

    标签: flutter flutter-web flutter-plugin


    【解决方案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'),
                    ),
                  )
                ],
              ),
            ),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 2021-07-18
      • 2020-05-05
      • 2020-09-18
      • 2020-01-07
      • 2021-04-28
      • 2022-10-31
      • 2022-11-02
      • 2020-09-25
      相关资源
      最近更新 更多