Flutter文件预览插件power_file_view的使用

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

Flutter文件预览插件power_file_view的使用

插件介绍

PowerFileView 是一个本地文件预览插件,支持预览 .doc, .docx, .ppt, .pptx, .xls, .xlsx, .pdf 等多种文件格式。它在 Android 上使用腾讯 TBS 服务,在 iOS 上使用 WKWebView。

支持的文件格式

格式 Android iOS
.doc
.docx
.ppt
.pptx
.xls
.xlsx
.pdf

整合步骤

1. 添加依赖

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

power_file_view: ^1.0.0
2. 快速集成

Android

  • 需要添加网络权限和存储权限。
  • AndroidManifest.xml 中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
  • 防止发布版本加载不到 TBS 内核库,需要在混淆文件 proguard-rules.pro 中添加以下代码:
-dontwarn dalvik.*
-dontwarn com.tencent.smtt.*

-keep class com.tencent.smtt.** {
    *;
}

-keep class com.tencent.tbs.** {
    *;
}
  • build.gradle 中配置删除无用资源:
buildTypes {
    release {
        shrinkResources false
        minifyEnabled false
        zipAlignEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

iOS

  • 使用 WKWebView 预览文件,所有支持的文件格式都可以通过 WKWebView 预览。

示例代码

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:power_file_view/power_file_view.dart';
import 'package:power_file_view_example/power_file_view_page.dart';

import 'permission_util.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  PowerFileViewManager.initLogEnable(true, true);
  PowerFileViewManager.initEngine();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomePage(),
    );
  }
}

const List<String> files = [
  "https://google-developer-training.github.io/android-developer-fundamentals-course-concepts/en/android-developer-fundamentals-course-concepts-en.pdf",
  "http://www.cztouch.com/upfiles/soft/testpdf.pdf",
  "http://blog.java1234.com/cizhi20211008.docx",
  "http://blog.java1234.com/moban20211008.xls"
];

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('文件列表'),
      ),
      body: ListView.builder(
          itemCount: files.length,
          itemBuilder: (context, index) {
            String filePath = files[index];
            final fileName = FileUtil.getFileName(filePath);
            final fileType = FileUtil.getFileType(filePath);
            return Container(
              margin: const EdgeInsets.only(top: 10.0),
              padding: const EdgeInsets.symmetric(horizontal: 15.0),
              child: ElevatedButton(
                onPressed: () async {
                  String savePath = await getFilePath(fileType, fileName);
                  onTap(context, filePath, savePath);
                },
                child: Text(fileName),
              ),
            );
          }),
    );
  }

  Future onTap(BuildContext context, String downloadUrl, String downloadPath) async {
    bool isGranted = await PermissionUtil.check();
    if (isGranted) {
      Navigator.of(context).push(
        MaterialPageRoute(builder: (ctx) {
          return PowerFileViewPage(
            downloadUrl: downloadUrl,
            downloadPath: downloadPath,
          );
        }),
      );
    } else {
      debugPrint('no permission');
    }
  }

  Future getFilePath(String type, String assetPath) async {
    final _directory = await getTemporaryDirectory();
    return "${_directory.path}/fileview/${base66.encode(utf8.encode(assetPath))}.$type";
  }
}

使用说明

文件预览

  • 网络文件: 传递要预览文件的下载 URL 和存储路径。
  • 本地文件: 传递文件的本地路径。
class PowerFileViewPage extends StatefulWidget {
  final String downloadUrl;
  final String downloadPath;

  const PowerFileViewPage({Key? key, required this.downloadUrl, required this.downloadPath}) : super(key: key);

  @override
  State&lt;PowerFileViewPage&gt; createState() =&gt; _PowerFileViewPageState();
}

class _PowerFileViewPageState extends State&lt;PowerFileViewPage&gt; {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('File Preview'),
      ),
      body: PowerFileViewWidget(
        downloadUrl: widget.downloadUrl,
        filePath: widget.downloadPath,
      ),
    );
  }
}

自定义进度显示和 错误显示

可以自定义加载进度和错误显示的样式。

PowerFileViewWidget(
  downloadUrl: widget.downloadUrl,
  filePath: widget.downloadPath,
  loadingBuilder: ( viewType, progress) {
    return Container(
      color: Colors.grey,
      alignment: Alignment.center,
      child: Text("Loading: $progress"),
    );
  },
  errorBuilder: ( viewType) {
    return Container(
      color: Colors.red,
      alignment: Alignment.center,
      child: const Text("Something went wrong!!!!"),
    );
  },
),

HTTP 配置(可选)

如果需要使用明文下载,需要进行以下配置:

Android

  • 创建 network_config.xml 文件并配置在 AndroidManifest.xml 中。
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
    &lt;base-config cleartextTrafficPermitted="true"/&gt;
&lt;/network-security-config&gt;

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;

更多关于Flutter文件预览插件power_file_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件预览插件power_file_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter文件预览插件power_file_view的示例代码。这个插件可以帮助你在Flutter应用中预览不同类型的文件,如文档、图片、视频等。

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

dependencies:
  flutter:
    sdk: flutter
  power_file_view: ^latest_version  # 请确保使用最新版本号

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

接下来,你可以在你的Flutter项目中使用PowerFileView组件来预览文件。以下是一个简单的示例代码:

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

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

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

class FilePreviewScreen extends StatelessWidget {
  // 示例文件路径,可以是本地路径或网络路径
  final String filePath = 'assets/sample.pdf'; // 替换为你的文件路径

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Preview'),
      ),
      body: Center(
        child: PowerFileView(
          filePath: filePath,
          onError: (error) {
            // 处理文件预览错误
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('File preview error: $error')),
            );
          },
          onLoadSuccess: () {
            // 文件加载成功时的回调
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('File loaded successfully')),
            );
          },
          // 可选参数,设置文件类型(如果插件能自动检测,这个可以不设置)
          fileType: PowerFileType.pdf,
          // 可选参数,设置预览配置(如PDF的缩放、翻页等)
          fileViewConfig: PowerFileViewConfig(
            // 示例:PDF预览配置
            if (filePath.endsWith('.pdf')) {
              return PowerPDFViewConfig(
                // 设置PDF初始缩放比例
                initialZoomLevel: 1.0,
                // 是否允许缩放
                isZoomEnabled: true,
                // 是否允许滚动
                isScrollEnabled: true,
              );
            } else {
              // 其他文件类型的配置(如文档、图片、视频等)
              return null;
            }
          ),
        ),
      ),
    );
  }
}

注意几点:

  1. filePath应替换为你实际要预览的文件路径。
  2. PowerFileTypePowerFileViewConfig是可选参数,根据文件类型可能需要进行设置。
  3. onErroronLoadSuccess是回调方法,用于处理文件加载过程中的错误和成功事件。

这个示例代码展示了如何使用power_file_view插件来预览PDF文件。如果你需要预览其他类型的文件(如Word文档、Excel表格、图片、视频等),你可以根据文件类型调整fileTypefileViewConfig参数。

请确保你已经在android/app/src/main/AndroidManifest.xmlios/Runner/Info.plist中配置了必要的权限,以便访问本地存储和网络资源。

回到顶部