Flutter文件查看插件flutter_file_view的使用

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

Flutter文件查看插件flutter_file_view的使用

pub package

语言: 中文 | English

当前插件仅适用于Android和iOS。

Android由Tencent X5实现。

iOS由WKWebView实现。

✅ 支持的文件类型

  • Android docx, doc, xlsx, xls, pptx, ppt, pdf, txt
  • iOS docx, doc, xlsx, xls, pptx, ppt, pdf, txt

⏰ 初始化

在应用启动时初始化插件:

FlutterFileView.init();

💼 2.0.x -> 2.1.0 版本更新

过期方案

@override
Widget build(BuildContext context) {
  return LocalFileViewer(filePath: localPath ?? '');
}

当前方案

@override
Widget build(BuildContext context) {
  return FileView(
    controller: FileViewController.asset('assets/files/$filePath'),
  );
}

FileViewController还有许多其他用法,例如表示某些状态等。

📲 使用第三方插件

使用dio进行网络请求。

⏳ 准备使用

版本约束

sdk: ">=2.14.0 <3.0.0"
flutter: ">=2.5.0"

依赖

  1. pubspec.yaml中添加flutter_file_view依赖:
dependencies:
  flutter_file_view: ^latest_version
  1. 执行以下命令获取包:
flutter pub get
  1. 引入包:
import 'package:flutter_file_view/flutter_file_view.dart';

本地化配置

MaterialApp中添加:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      ...
      localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
        ...
        ViewerLocalizationsDelegate.delegate,
      ],
      ...
    );
  }
}

🤖 Android

Android P 无法下载内核解决方案

AndroidManifest.xml文件的application标签中添加以下代码:

android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"

res/xml目录下创建一个名为network_security_config.xml的文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

注意事项

示例Demo

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_file_view/flutter_file_view.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() => 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() {
    FlutterFileView.init();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      localizationsDelegates: <LocalizationsDelegate<dynamic>>[
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        FileViewLocalizationsDelegate.delegate,
      ],
      supportedLocales: <Locale>[Locale('en', 'US'), Locale('zh', 'CN')],
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<String> files = [
    'FileTest.docx',
    'FileTest.doc',
    'FileTest.xlsx',
    'FileTest.xls',
    'FileTest.pptx',
    'FileTest.ppt',
    'FileTest.pdf',
    'FileTest.txt',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('File View')),
      body: _buildBodyWidget(),
    );
  }

  Widget _buildBodyWidget() {
    return ListView.builder(
      itemCount: files.length,
      itemBuilder: (BuildContext context, int index) {
        final String filePath = files[index];
        String fileShowText = '';

        final int i = filePath.lastIndexOf('/');
        if (i <= -1) {
          fileShowText = filePath;
        } else {
          fileShowText = filePath.substring(i + 1);
        }

        final Widget child = ElevatedButton(
          onPressed: () {
            FileViewController? controller;

            if (filePath.contains('http://') || filePath.contains('https://')) {
              controller = FileViewController.network(filePath);
            } else {
              controller = FileViewController.asset('assets/files/$filePath');
            }

            Navigator.of(context).push(
              MaterialPageRoute<void>(
                builder: (_) => FileViewPage(controller: controller!),
              ),
            );
          },
          child: Text(fileShowText),
        );

        return Container(
          margin: const EdgeInsets.only(top: 10),
          padding: const EdgeInsets.symmetric(horizontal: 15),
          child: child,
        );
      },
    );
  }
}

如果你喜欢这个项目,请在项目的右上角点击“Star”。你的支持是我最大的鼓励!^_^


以上是关于Flutter文件查看插件`flutter_file_view`的使用指南和完整示例代码。希望对你有所帮助!

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_file_view插件来查看文件的示例代码。这个插件允许你在Flutter应用中打开和查看各种类型的文件。

首先,确保你的Flutter项目已经创建,并且你已经在pubspec.yaml文件中添加了flutter_file_view依赖:

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

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

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

  1. 导入插件

在你的Dart文件中导入flutter_file_view插件:

import 'package:flutter_file_view/flutter_file_view.dart';
  1. 请求存储权限(如果需要):

如果你的应用需要访问设备的存储来读取文件,你可能需要请求存储权限。这通常是在Android和iOS上必需的。以下是一个简单的权限请求示例:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    var result = await Permission.storage.request();
    if (!result.isGranted) {
      // 处理权限被拒绝的情况
      throw Exception('存储权限被拒绝');
    }
  }
}

注意:你需要添加permission_handler依赖来处理权限请求。

  1. 使用FlutterFileView小部件

现在,你可以使用FlutterFileView小部件来查看文件。假设你有一个文件的路径,这里是如何显示它的代码示例:

import 'package:flutter/material.dart';
import 'package:flutter_file_view/flutter_file_view.dart';
import 'package:permission_handler/permission_handler.dart'; // 仅用于权限请求

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

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

class FileViewerScreen extends StatefulWidget {
  @override
  _FileViewerScreenState createState() => _FileViewerScreenState();
}

class _FileViewerScreenState extends State<FileViewerScreen> {
  @override
  void initState() {
    super.initState();
    _requestPermissionsAndViewFile();
  }

  Future<void> _requestPermissionsAndViewFile() async {
    try {
      await requestPermissions();
      // 假设这是你要查看的文件路径
      String filePath = '/path/to/your/file.txt';
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => Scaffold(
            appBar: AppBar(
              title: Text('查看文件'),
            ),
            body: FlutterFileView(
              filePath: filePath,
              fileTypeHint: 'text/plain', // 根据你的文件类型设置
            ),
          ),
        ),
      );
    } catch (e) {
      // 处理异常,例如权限被拒绝
      print('Error: $e');
    }
  }

  Future<void> requestPermissions() async {
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      var result = await Permission.storage.request();
      if (!result.isGranted) {
        throw Exception('存储权限被拒绝');
      }
    }
  }
}

在这个示例中,我们首先请求存储权限,然后使用FlutterFileView小部件来显示指定路径的文件。注意,fileTypeHint参数应该根据你要查看的文件类型来设置,以便插件能够正确地渲染文件内容。

请确保替换/path/to/your/file.txt为你实际要查看的文件的路径,并且根据你的文件类型调整fileTypeHint的值。

这个示例展示了如何在Flutter应用中使用flutter_file_view插件来查看文件。根据你的具体需求,你可能需要进一步定制这个示例。

回到顶部