Flutter微信资源选择器插件reactive_wechat_assets_picker的使用

Flutter微信资源选择器插件reactive_wechat_assets_picker的使用

reactive_wechat_assets_picker 是一个基于 wechat_assets_picker 的封装插件,用于与 reactive_forms 配合使用。目前文档还在编写中,可以在示例文件夹中查看示例代码。

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 reactive_wechat_assets_picker 插件来选择微信资源。

import 'package:flutter/material.dart';
import 'package:reactive_wechat_assets_picker/reactive_wechat_assets_picker.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:reactive_wechat_assets_picker_example/selected_assets_list_view.dart'; // 假设这是一个自定义组件

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 构建表单
  FormGroup buildForm() => fb.group({
        'input': FormControl<List<AssetEntity>>(value: []),
      });

  // 移除选中的资产
  Function(int index) remove(List<AssetEntity> assets) {
    return (int index) {
      assets.removeAt(index);
      setState(() {});
    };
  }

  // 处理选择结果
  void onResult(List<AssetEntity>? assets) {
    if (mounted) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    // 使用 ReactiveWechatAssetsPicker 组件选择微信资源
                    ReactiveWechatAssetsPicker<List<AssetEntity>>(
                      formControlName: 'input',
                      imagePickerBuilder: (pick, images, _) {
                        return Column(
                          children: [
                            // 显示已选择的资产列表
                            SelectedAssetsListView(
                              assets: images,
                              isDisplayingDetail: ValueNotifier(true),
                              onResult: onResult,
                              onRemoveAsset: remove(images),
                            ),
                            // 按钮用于触发资源选择
                            ElevatedButton(
                              onPressed: pick,
                              child: const Text('Pick'),
                            ),
                          ],
                        );
                      },
                    ),
                    // 提交按钮
                    ElevatedButton(
                      child: const Text('Submit'),
                      onPressed: () {
                        if (form.valid) {
                          debugPrint(form.value.toString());
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

说明

  1. 导入必要的包

    import 'package:flutter/material.dart';
    import 'package:reactive_wechat_assets_picker/reactive_wechat_assets_picker.dart';
    import 'package:reactive_forms/reactive_forms.dart';
    
  2. 构建表单

    FormGroup buildForm() => fb.group({
          'input': FormControl<List<AssetEntity>>(value: []),
        });
    
  3. 处理移除操作

    Function(int index) remove(List<AssetEntity> assets) {
      return (int index) {
        assets.removeAt(index);
        setState(() {});
      };
    }
    
  4. 处理选择结果

    void onResult(List<AssetEntity>? assets) {
      if (mounted) {
        setState(() {});
      }
    }
    
  5. 构建应用界面

    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    ReactiveWechatAssetsPicker<List<AssetEntity>>(
                      formControlName: 'input',
                      imagePickerBuilder: (pick, images, _) {
                        return Column(
                          children: [
                            SelectedAssetsListView(
                              assets: images,
                              isDisplayingDetail: ValueNotifier(true),
                              onResult: onResult,
                              onRemoveAsset: remove(images),
                            ),
                            ElevatedButton(
                              onPressed: pick,
                              child: const Text('Pick'),
                            ),
                          ],
                        );
                      },
                    ),
                    ElevatedButton(
                      child: const Text('Submit'),
                      onPressed: () {
                        if (form.valid) {
                          debugPrint(form.value.toString());
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
    

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

1 回复

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


当然,以下是如何在Flutter项目中使用reactive_wechat_assets_picker插件的一个示例代码案例。这个插件允许用户像在微信中选择资源(图片和视频)一样,在Flutter应用中实现类似的功能。

首先,确保你的Flutter项目已经添加了这个插件。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  reactive_wechat_assets_picker: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用这个插件:

  1. 导入插件
import 'package:reactive_wechat_assets_picker/reactive_wechat_assets_picker.dart';
  1. 使用插件

在你的主页面或需要选择资源的页面中,使用ReactiveWeChatAssetsPicker组件。以下是一个完整的示例:

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

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

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

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<AssetEntity> selectedAssets = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WeChat Assets Picker Demo'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: ReactiveWeChatAssetsPicker(
              maxAssets: 9,
              selectedAssets: selectedAssets.map((e) => e.id).toList(),
              onChange: (assets) {
                setState(() {
                  selectedAssets = assets;
                });
              },
              onConfirm: (assets) {
                // 用户点击确认按钮后的回调
                setState(() {
                  selectedAssets = assets;
                });
                // 这里可以处理选中的资源,例如上传到服务器等
              },
            ),
          ),
          Divider(),
          Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 4.0,
                mainAxisSpacing: 4.0,
              ),
              itemCount: selectedAssets.length,
              itemBuilder: (context, index) {
                AssetEntity asset = selectedAssets[index];
                return Image.file(
                  File(asset.originFile.path),
                  fit: BoxFit.cover,
                );
              },
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 清空选中的资源
          setState(() {
            selectedAssets = [];
          });
        },
        tooltip: 'Clear',
        child: Icon(Icons.clear),
      ),
    );
  }
}

在这个示例中:

  • 我们创建了一个简单的Flutter应用,其中包含一个ReactiveWeChatAssetsPicker组件,允许用户选择最多9个资源(图片或视频)。
  • selectedAssets列表用于存储用户选中的资源。
  • 当用户选择资源时,onChange回调会被触发,更新selectedAssets列表。
  • 用户点击确认按钮后,onConfirm回调会被触发,你可以在这里处理选中的资源。
  • 底部有一个FloatingActionButton,用于清空选中的资源。

请确保在实际使用中处理资源访问权限,特别是在Android和iOS平台上,你可能需要在AndroidManifest.xmlInfo.plist中添加相应的权限声明。

这个示例代码应该能帮助你快速上手reactive_wechat_assets_picker插件的使用。如果你有任何进一步的问题或需要更详细的指导,请随时提问。

回到顶部