Flutter资源选择插件simple_asset_picker的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter资源选择插件simple_asset_picker的使用

simple_asset_picker 插件介绍

simple_asset_picker 是一个参考了 KakaoTalk UI 设计的 Flutter 图片选择插件。它仅支持 Android 和 iOS 平台,并且依赖于 photo_managerflutter_riverpodvideo_player 这些库。该插件支持照片和视频的选择、拍摄、预览等功能。

使用方法

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  simple_asset_picker: 最新版本使用
Android 部署

AndroidManifest.xml 中添加权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<uses-permission android:name="android.permission.INTERNET" />

确保 Gradle 版本(gradle-wrapper.properties)为 7.5.1 及以上,Kotlin 版本(ext.kotlin_version)为 1.7.22 及以上,AGP 版本(com.android.tools.build:gradle)为 7.2.2 及以上。

修改 build.gradle 中的最小 SDK 版本:

defaultConfig {
    ...
    minSdkVersion 22
    ...
}
iOS 部署

Info.plist 中添加权限设置:

&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
  &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;
&lt;key&gt;NSPhotoLibraryUsageDescription&lt;/key&gt;
&lt;string&gt;ギャラリーアクセス権限が必要です.&lt;/string&gt;
&lt;key&gt;NSPhotoLibraryAddUsageDescription&lt;/key&gt;
&lt;string&gt;写真や動画の撮影を行うための権限が必要です.&lt;/string&gt;
&lt;key&gt;NSCameraUsageDescription&lt;/key&gt;
&lt;string&gt;カメラアクセス権限が必要です.&lt;/string&gt;
&lt;key&gt;NSMicrophoneUsageDescription&lt;/key&gt;
&lt;string&gt;映像撮影のために必要な権限です.&lt;/string&gt;
&lt;!-- localize --&gt;
&lt;key&gt;CFBundleDevelopmentRegion&lt;/key&gt;
&lt;array&gt;
  &lt;string&gt;ko-KR&lt;/string&gt;
  &lt;string&gt;en-US&lt;/string&gt;
&lt;/array&gt;
&lt;key&gt;CFBundleLocalizations&lt;/key&gt;
&lt;array&gt;
  &lt;string&gt;ko-KR&lt;/string&gt;
  &lt;string&gt;en-US&lt;/string&gt;
&lt;/array&gt;

如果权限被拒绝,会显示“权限未授予”信息。为了确保权限总是被授予,可以使用 permission_handler 库来处理权限请求:

import 'package:permission_handler/permission_handler.dart';

void main() async {
  await PermissionHandler().request();
  runApp(const ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const Home(),
    );
  }
}

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

  [@override](/user/override)
  State&lt;Home&gt; createState() =&gt; _HomeState();
}

class _HomeState extends State&lt;Home&gt; {
  List&lt;AssetEntity&gt; list = [];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          ElevatedButton(
            onPressed: () async {
              list = await Picker.pickAssets(
                context,
                pickerConfig: PickerConfig(
                  mainColor: Colors.green,
                  brightness: Brightness.light,
                  gridCount: 3,
                  maxAssets: 10,
                  pageSize: 30,
                  requestType: RequestType.common,
                  selectedAssets: list,
                  useCamera: true,
                ),
              );
              setState(() {});
            },
            child: const Text('사진선택'),
          ),
          const SizedBox(
            height: 50,
          ),
          Container(
            color: Colors.grey[200],
            height: list.isEmpty ? 0 : 120,
            padding: const EdgeInsets.symmetric(
              vertical: 5,
              horizontal: 15,
            ),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                const Text('선택한 사진'),
                Expanded(
                  child: ListView.separated(
                    scrollDirection: Axis.horizontal,
                    itemCount: list.length,
                    itemBuilder: (_, index) {
                      return SizedBox(
                        width: 100,
                        child: Stack(
                          fit: StackFit.expand,
                          children: [
                            Padding(
                              padding: const EdgeInsets.all(5),
                              child: AssetEntityImage(
                                list[index],
                                isOriginal: false,
                                thumbnailSize: const ThumbnailSize.square(80),
                                fit: BoxFit.contain,
                              ),
                            ),
                          ],
                        ),
                      );
                    },
                    separatorBuilder: (_, __) {
                      return const SizedBox(
                        width: 5,
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter资源选择插件simple_asset_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter资源选择插件simple_asset_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用simple_asset_picker插件的示例代码。simple_asset_picker是一个强大的资源选择插件,允许用户从设备中选择图片、视频等多媒体资源。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加simple_asset_picker依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_asset_picker: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 导入包

在你的Dart文件中导入simple_asset_picker包:

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

3. 使用AssetPicker

下面是一个简单的示例,展示如何使用AssetPicker来选择图片和视频:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Asset Picker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<AssetEntity> _assets = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Asset Picker Demo'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 4.0,
                mainAxisSpacing: 4.0,
              ),
              itemCount: _assets.length,
              itemBuilder: (context, index) {
                AssetEntity asset = _assets[index];
                AssetThumbData? thumbData = asset.thumbDataWithSize(
                  width: 100,
                  height: 100,
                );
                return GestureDetector(
                  onTap: () {
                    // 你可以在这里添加点击图片后的逻辑,比如预览图片
                  },
                  child: Image.memory(
                    thumbData!.bytes!,
                    fit: BoxFit.cover,
                  ),
                );
              },
            ),
          ),
          ElevatedButton(
            onPressed: () async {
              final List<AssetEntity> result = await AssetPicker.pickAssets(
                context,
                requestType: RequestType.imageAndVideo,
                maxAssets: 9,
                selectedAssets: _assets,
              );
              setState(() {
                _assets = result;
              });
            },
            child: Text('选择图片和视频'),
          ),
        ],
      ),
    );
  }
}

代码解释

  1. 依赖添加:首先在pubspec.yaml中添加simple_asset_picker依赖。
  2. 导入包:在Dart文件中导入simple_asset_picker包。
  3. UI构建
    • 使用ScaffoldAppBar创建了一个简单的页面结构。
    • 使用GridView.builder展示已选择的资源(图片和视频)。
    • 使用ElevatedButton创建一个按钮,点击按钮时会调用AssetPicker.pickAssets方法,允许用户从设备中选择资源。
  4. 资源选择
    • AssetPicker.pickAssets方法允许用户选择图片和视频。
    • requestType: RequestType.imageAndVideo表示用户可以选择图片和视频。
    • maxAssets: 9限制用户最多选择9个资源。
    • selectedAssets: _assets传递已选择的资源列表,以便在下次打开选择器时显示已选择的资源。

这样,你就可以在你的Flutter项目中使用simple_asset_picker插件来选择图片和视频资源了。

回到顶部