Flutter文件管理与分享插件whatsfile的使用

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

Flutter文件管理与分享插件whatsfile的使用

本Flutter插件用于Android平台,通过WhatsApp分享PDF文件。

特性:

  • 该插件可以将PDF文件分享给WhatsApp中的特定联系人。
  • 插件支持未保存的联系人。
  • 该插件会将联系人保存到手机上。

注意事项:

  • 由于需要同步联系人到手机,分享PDF文件到WhatsApp大约需要8到10秒时间。
  • 联系人的名称将会被保存为"My Contact"。

安装:

对于Android平台:

如果你打算使用文件分享功能,需要配置FileProvider,这将使文件访问成为可能,并允许与其他应用共享文件。

AndroidManifest.xml中添加以下代码:

<application>
...
 <provider
           android:name="androidx.core.content.FileProvider"
           android:authorities="${applicationId}.provider"
           android:exported="false"
           android:grantUriPermissions="true"
           tools:ignore="MissingClass">
           <meta-data
               android:name="android.support.FILE_PROVIDER_PATHS"
               android:resource="@xml/file_paths" />
       </provider>
</application>

res文件夹中创建xml目录并添加file_paths.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="/" />
    <cache-path
        name="cache"
        path="/" />
    <external-path name="external_files" path="/" />
    <external-cache-path
        name="external_cache"
        path="/" />
    <external-files-path
        name="external_files"
        path="/" />
</paths>

如何使用?

在你的Flutter项目中,你可以使用以下代码来分享PDF文件到WhatsApp:

ElevatedButton(
  onPressed: () async {
    ShareToWhatsapp.sharePDF(paths!, 'application/pdf', "911234567890");
  },
  child: Text('分享PDF'),
),

完整示例代码

文件:example/lib/main.dart

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

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  final _whatsfilePlugin = ShareToWhatsapp();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,所以我们初始化时使用异步方法。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用try/catch处理PlatformException。
    // 我们也处理消息可能返回null的情况。
    try {
      platformVersion =
          await _whatsfilePlugin.getPlatformVersion() ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果在异步平台消息还在飞行时小部件从树中移除,我们想要丢弃回复而不是调用
    // setState以更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }
  var paths=""; // 这里需要设置正确的路径

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('WhatsApp分享应用'),
        ),
        body: Center(
          child: Column(
            children: [
              MaterialButton(
                onPressed: () async {
                  ShareToWhatsapp.sharePDF(paths!, 'application/pdf', "911234567891");
                },
                child: Text(
                  "发送PDF到WhatsApp",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文件管理与分享插件whatsfile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件管理与分享插件whatsfile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中的文件管理与分享插件whatsfile(假设这是一个虚构的插件名称,因为实际上Flutter社区中并没有一个广泛认可的名为whatsfile的插件,但我会基于文件管理和分享功能给出一个类似的实现思路和代码示例),你可以使用Flutter结合一些现有的插件来实现这些功能。

在Flutter中,文件管理和分享通常涉及以下几个步骤:

  1. 文件选择/创建:使用文件选择器插件让用户选择文件或创建新文件。
  2. 文件管理:对选中的文件进行读取、写入等操作。
  3. 文件分享:使用分享插件将文件分享到其他应用。

下面是一个简化的代码示例,展示了如何使用file_pickershare_plus这两个Flutter插件来实现文件选择和分享功能。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  file_picker: ^4.3.3  # 确保使用最新版本
  share_plus: ^3.0.4   # 确保使用最新版本

2. 导入插件

在你的Dart文件中导入这些插件:

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

3. 实现文件选择和分享功能

下面是一个简单的示例,展示了如何让用户选择文件并分享它:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FileShareScreen(),
    );
  }
}

class FileShareScreen extends StatefulWidget {
  @override
  _FileShareScreenState createState() => _FileShareScreenState();
}

class _FileShareScreenState extends State<FileShareScreen> {
  File? _selectedFile;

  Future<void> _pickFile() async {
    final result = await FilePicker.platform.pickFiles(
      type: FileType.any, // 可以选择任何类型的文件
    );

    if (result != null) {
      setState(() {
        if (result.files.isNotEmpty) {
          _selectedFile = File(result.files.first.path!);
        }
      });
    }
  }

  Future<void> _shareFile() async {
    if (_selectedFile != null) {
      final byteData = await _selectedFile!.readAsBytes();
      final fileBytes = base64Encode(byteData);

      final RenderRepaintBoundary boundary =
          globalKey.currentState!.context.findRenderObject()!
              as RenderRepaintBoundary;
      final image = await boundary.toImage();
      final byteData = await image.toByteData(format: ImageByteFormat.png);
      final pngBytes = byteData!.buffer.asUint8List();

      // 注意:这里的分享实际上是将文件内容转换为Base64字符串,并通过文本形式分享。
      // 对于大型文件或二进制文件,这种方法可能不适用,需要寻找其他方式分享文件(如通过文件URI)。
      await Share.shareFiles([_selectedFile!.path!],
          text: 'Sharing a file with you!',
          sharePositionOrigin: boundingBoxOfWidget(globalKey));
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('No file selected to share')),
      );
    }
  }

  final GlobalKey globalKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Picker and Share Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickFile,
              child: Text('Pick a File'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _shareFile,
              child: Text('Share Selected File'),
            ),
            if (_selectedFile != null)
              Container(
                key: globalKey,
                height: 200,
                width: 200,
                child: Image.file(_selectedFile!),
              ),
          ],
        ),
      ),
    );
  }
}

注意

  1. 上述代码中的_shareFile方法尝试分享文件,但share_plus插件直接分享文件的能力可能受限,特别是跨平台时。你可能需要将文件上传到服务器,然后分享文件的URL,或者使用其他方式(如Intent在Android上分享文件URI)。
  2. 对于大型文件,直接转换为Base64字符串可能不是最佳实践,因为这会增加内存消耗并降低性能。
  3. 实际应用中,你可能需要处理更多的错误情况和边界条件。

这个示例提供了一个基础框架,你可以根据实际需求进一步扩展和完善。

回到顶部