【问题标题】:How to display images from a external storage path in flutter?如何在颤动中显示来自外部存储路径的图像?
【发布时间】:2019-01-04 09:51:52
【问题描述】:

我基本上是 Flutter 的新手。我想显示来自特定路径的图像,例如“存储/WhatsApp/媒体/”。我想在网格视图中显示所有图像。我怎样才能在颤动中实现这一点。我见过很多例子,但每个人都在使用 assets 文件夹。这是获取路径的代码。如何在网格视图中显示它们?

 Future<String> get localpath async
 {
  final dir=await getExternalStorageDirectory();
  return dir.path;
 }

 Future<File> get localfile async{
 final path=await localpath;
 return File('$path/WhatsApp/Media/WhatsApp Images');
}

Future<String> readData() async{
try{
  final file=await localfile;
  String image_path=await file.readAsString();
  return image_path;
}
catch(e) {return e.toString();}
}

既然我得到了路径,如何在 gridview 中显示图像?我应该使用 gridview.builder 吗?

【问题讨论】:

  • 您走在正确的道路上。确保检查FileImage 类并使用 Gridview.builder 应该可以正常工作。看到这个blog
  • 是的,我明白了。但假设该目录有 10 张图像,例如“WA001.JPG,WA004.JPG”。我应该创建一个数组列表并将其发送到 FileImage 吗?
  • 不,Gridview.builder 使用列表在 itembuilder 属性内构建 10 个 FileImages - 比较我链接的博客上的示例。

标签: android file datagridview flutter android-gridview


【解决方案1】:

提供你的存储路径,你可以显示图片

Image.file(File(imagePath);

【讨论】:

    【解决方案2】:

    我尝试采用与您类似的方法来使用path_provider 获取文件。但是,即使使用getExternalStorageDirectory(),插件也只能获取应用程序的目录。这个Stack Overflow post中也指出了这种行为。

    相反,我使用ext_storage 来访问设备的存储空间。

    此示例应用演示了使用 ext_storage 获取设备的 /Download 文件夹中的文件、使用 permission_handler 处理权限、文件扩展名检查以及在 GridView 上显示来自路径的图像。

    import 'dart:io';
    
    import 'package:flutter/material.dart';
    import 'package:ext_storage/ext_storage.dart';
    import 'package:permission_handler/permission_handler.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      Future _futureGetPath;
      List<dynamic> listImagePath = List<dynamic>();
      var _permissionStatus;
    
      @override
      void initState() {
        super.initState();
        _listenForPermissionStatus();
        // Declaring Future object inside initState() method
        // prevents multiple calls inside stateful widget
        _futureGetPath = _getPath();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Expanded(
                flex: 1,
                child: FutureBuilder(
                  future: _futureGetPath,
                  builder: (BuildContext context, AsyncSnapshot snapshot) {
                    if (snapshot.hasData) {
                      var dir = Directory(snapshot.data);
                      print('permission status: $_permissionStatus');
                      if (_permissionStatus) _fetchFiles(dir);
                      return Text(snapshot.data);
                    } else {
                      return Text("Loading");
                    }
                  },
                ),
              ),
              Expanded(
                flex: 19,
                child: GridView.count(
                  primary: false,
                  padding: const EdgeInsets.all(20),
                  crossAxisSpacing: 10,
                  mainAxisSpacing: 10,
                  crossAxisCount: 3,
                  children: _getListImg(listImagePath),
                ),
              )
            ],
          ),
        );
      }
    
      // Check for storage permission
      void _listenForPermissionStatus() async {
        final status = await Permission.storage.request().isGranted;
        // setState() triggers build again
        setState(() => _permissionStatus = status);
      }
    
      // Get storage path
      // https://pub.dev/documentation/ext_storage/latest/
      Future<String> _getPath() {
        return ExtStorage.getExternalStoragePublicDirectory(
            ExtStorage.DIRECTORY_DOWNLOADS);
      }
    
      _fetchFiles(Directory dir) {
        List<dynamic> listImage = List<dynamic>();
        dir.list().forEach((element) {
          RegExp regExp =
          new RegExp("\.(gif|jpe?g|tiff?|png|webp|bmp)", caseSensitive: false);
          // Only add in List if path is an image
          if (regExp.hasMatch('$element')) listImage.add(element);
          setState(() {
            listImagePath = listImage;
          });
        });
      }
    
      List<Widget> _getListImg(List<dynamic> listImagePath) {
        List<Widget> listImages = List<Widget>();
        for (var imagePath in listImagePath) {
          listImages.add(
            Container(
              padding: const EdgeInsets.all(8),
              child: Image.file(imagePath, fit: BoxFit.cover),
            ),
          );
        }
        return listImages;
      }
    }
    

    请注意,这仅涵盖在 GridView 上显示图像的基础知识。为了扩大规模,我建议在performance best practices 上遵循本指南。

    【讨论】:

      【解决方案3】:

      localfile 返回异步值,因此需要使用 await 使用它,然后使用 setState() 更新它

      示例:

      Future<File> get localfile async {
        final path= await localpath;
        return File('$path/WhatsApp/Media/WhatsApp Images');
      }
      
      File file = await localfile;
      setState(() {});
      

      使用Image.file 小部件显示存储文件

        Image.file(file, fit: BoxFit.cover,)
      

      注意:文件对象最初为空,因为它正在获取异步值,因此使用三元操作并显示进度指示器或任何其他小部件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多