返回

Flutter与iOS原生调用相册的差异:揭秘背后的技术

IOS

iOS14引入的PHPicker为Flutter开发者带来了新的选择,可以轻松访问设备的相册。然而,PHPicker获取到的图片地址与使用UIImagePickerViewController获得的地址之间存在细微差别。本文将深入探讨这两种方法之间的差异,并提供实用指南,帮助开发者根据项目需求做出明智选择。

PHPicker:iOS 14带来的新体验

PHPicker是iOS 14中引入的图像选择器,旨在提供更流畅、更一致的相册访问体验。与传统的UIImagePickerViewController不同,PHPicker仅显示图片和视频,而无需选择器控制或编辑选项。这使得它成为一种更简洁、更现代的方式来访问设备相册。

import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';

class ImagePickerExample extends StatefulWidget {
  @override
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  late File _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image == null ? Text('No image selected.') : Image.file(_image),
            ElevatedButton(
              onPressed: () async {
                final picker = ImagePicker();
                final pickedFile = await picker.getImage(source: ImageSource.camera);
                setState(() {
                  _image = File(pickedFile.path);
                });
              },
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}

UIImagePickerViewController:可靠的旧方法

UIImagePickerViewController是Flutter中访问设备相册的另一种方法。它提供了比PHPicker更广泛的控制和定制选项。开发者可以使用它来显示自定义选择器控制、允许图像编辑,甚至设置图片库的初始状态。

import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';

class ImagePickerExample extends StatefulWidget {
  @override
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  late File _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image == null ? Text('No image selected.') : Image.file(_image),
            ElevatedButton(
              onPressed: () async {
                final picker = ImagePicker();
                final pickedFile = await picker.getImage(source: ImageSource.gallery);
                setState(() {
                  _image = File(pickedFile.path);
                });
              },
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}

临时路径与永久路径:差异关键所在

PHPicker获取到的图片地址是临时路径,而UIImagePickerViewController获取到的地址是永久路径。临时路径会在一定时间后被系统自动删除,而永久路径则不会。这意味着如果开发者使用PHPicker获取图片,则需要立即保存图片到永久路径,以避免丢失数据。

import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';

class ImagePickerExample extends StatefulWidget {
  @override
  _ImagePickerExampleState createState() => _ImagePickerExampleState();
}

class _ImagePickerExampleState extends State<ImagePickerExample> {
  late File _image;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _image == null ? Text('No image selected.') : Image.file(_image),
            ElevatedButton(
              onPressed: () async {
                final picker = ImagePicker();
                final pickedFile = await picker.getImage(source: ImageSource.camera);
                setState(() {
                  _image = File(pickedFile.path);
                });
              },
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}

选择哪种方法?

在选择是使用PHPicker还是UIImagePickerViewController时,开发者需要考虑以下因素:

  • 所需的控制和定制程度: 如果开发者需要对图像选择器有更多的控制,则应使用UIImagePickerViewController。
  • 临时路径与永久路径的处理: 如果开发者可以接受临时路径,则可以使用PHPicker。否则,应使用UIImagePickerViewController。
  • 开发平台和版本: PHPicker仅在iOS 14及更高版本中可用。如果开发者需要支持较低版本的iOS,则应使用UIImagePickerViewController。

结论

PHPicker和UIImagePickerViewController都是Flutter中访问设备相册的有效方法。根据项目的具体需求,开发者可以选择最适合的方法。通过理解这两者之间的差异,开发者可以做出明智的决定,为用户提供最佳的图像选择体验。