如何在flutter中不使用image_picker或其他包从gallery中获取图像

2izufjch  于 2023-11-21  发布在  Flutter
关注(0)|答案(3)|浏览(92)

我需要从图库中获取所有图像,而不使用image_picker或flutter中的其他包。
我尝试使用image_picker.但事实证明,它不能使用.以及如何接收图像后显示所选图像的预览?

wwwo4jvm

wwwo4jvm1#

您可以查看image_picker的底层工作方式,并检查其本机实现,以确定可以使用的本机方法。
https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker
关于如何在Flutter应用程序中运行本机代码,请参阅此页面(您也可以在不使用软件包的情况下运行本机代码):https://docs.flutter.dev/platform-integration/platform-channels
问题是,为什么你不能使用软件包?它们应该很容易通过pub.dev包含,或者甚至作为pubspec.yaml中的本地依赖项(如果前者不起作用)。
要显示预览,我知道image_picker会将文件复制到应用程序的临时目录(您可以使用getTemporaryDirectory()path_provider获取),之后您可以在应用程序中显示Image.file作为预览。

8ehkhllq

8ehkhllq2#

您可以在MediaStore中查询图像文件。
如果您有READ_MEDIA_ICODE权限,您将获得设备上的所有文件。

wqlqzqxt

wqlqzqxt3#

是的,你可以做到这一点。看看下面的代码段。
1.首先,你应该使变量为File类型。

File? _imageFile;

字符串
2.然后你应该做一个方法来选择image.like下面,

Future<void> _selectImageFromGallery() async {
    final picker = ImagePicker();
    final pickedImage = await picker.pickImage(source: ImageSource.gallery);

    if (pickedImage != null) {
      setState(() {
        _imageFile = File(pickedImage.path);
      });
    }
  }


3.现在你可以访问像波纹管代码的图像。

Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Select Image from Gallery'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imageFile != null
                ? Image.file(
                    _imageFile!,
                    width: 200,
                    height: 200,
                  )
                : Text('No image selected'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _selectImageFromGallery,
              child: Text('Select Image'),
            ),
          ],
        ),
      ),
    );
  }

完整代码部分

class UploadImage extends StatefulWidget {
  const UploadImage({super.key});

  @override
  State<UploadImage> createState() => _UploadImageState();
}

    class _UploadImageState extends State<UploadImage> {
      
    
      File? _imageFile;
    
      Future<void> _selectImageFromGallery() async {
        final picker = ImagePicker();
        final pickedImage = await picker.pickImage(source: ImageSource.gallery);
    
        if (pickedImage != null) {
          setState(() {
            _imageFile = File(pickedImage.path);
          });
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Select Image from Gallery'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                _imageFile != null
                    ? Image.file(
                        _imageFile!,
                        width: 200,
                        height: 200,
                      )
                    : Text('No image selected'),
                SizedBox(height: 20),
                ElevatedButton(
                  onPressed: _selectImageFromGallery,
                  child: Text('Select Image'),
                ),
              ],
            ),
          ),
        );
    
      }
      }

  • 如果你想使用filepicker尝试以下步骤,*

1.在使用此方法之前,您应该添加一些软件包,

file_picker: ^5.5.0


你可以用这个link得到它
现在你可以像这样导入'package:file_picker/file_picker.dart';

import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';

    class UploadImage extends StatefulWidget {
      const UploadImage({super.key});
    
      @override
      State<UploadImage> createState() => _UploadImageState();
    }
    
    class _UploadImageState extends State<UploadImage> {
      File? file;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Upload Image'),
          ),
          body: SingleChildScrollView(
            child: Center(
              child: Column(
                children: [
                  file != null
                      ? Image.file(file!)
                      : Image.asset('assets/images/defult.png'),
                  TextButton(
                    onPressed: () {
                      pickFile();
                    },
                    child: const Text('Pick a file'),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    
      pickFile() async {
        FilePickerResult? result =
            await FilePicker.platform.pickFiles(type: FileType.image);
    
        if (result != null) {
          setState(() {
            file = File(result.files.single.path ?? "");
          });
        }
      }


这样做,你现在可以解决你的问题。

相关问题