Flutter文件预览插件in_app_file_view的使用

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

Flutter文件预览插件in_app_file_view的使用

📄 In-App File View for Flutter

一个专门为iOS设计的Flutter插件,用于在应用内部轻松查看各种文件类型(如PDF、DOC、PPT、Excel、图片等)。通过无缝集成和用户友好的界面,该插件确保了流畅且优化的文件查看体验。

iOS实现利用了WKWebView来实现高性能的文件渲染。


✨ 特性概览

📂 广泛的文件类型支持

轻松查看以下流行的文件格式:

  • 文档DOCXDOCTXT
  • 演示文稿PPTXPPT
  • 电子表格XLSXXLS
  • PDF文件PDF
  • 图像PNGJPGJPEGHEICGIF
🚀 原生集成

使用原生iOS代码构建,提供优雅、响应迅速且可靠的文件查看体验。

🛠️ 性能优化

所有支持的文件类型均能快速加载和流畅渲染。

💡 用户友好设计

简洁现代的界面以增强用户体验。


🎯 为什么选择In-App File View?

告别打开外部应用的麻烦!使用In-App File View,您的用户可以直接在应用内查看多种类型的文件。无论是构建生产力工具、教育应用还是文件共享平台,此插件都是理想之选。


📖 入门指南

1. 将插件添加到项目中

pubspec.yaml文件中包含插件:

dependencies:
  in_app_file_view: 1.1.1

示例代码

example/lib/main.dart

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

import 'page_file_view.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> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

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

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('文件查看')),
      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,
        );
      },
    );
  }
}

example/lib/page_file_view.dart

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

class FileViewPage extends StatelessWidget {
  final FileViewController controller;

  const FileViewPage({Key? key, required this.controller}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('文件查看'),
      ),
      body: FileView(
        controller: controller,
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter文件预览插件in_app_file_view的示例代码。这个插件允许你在Flutter应用中预览不同类型的文件,如PDF、图片、文本等。

首先,确保你已经在pubspec.yaml文件中添加了in_app_file_view依赖:

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

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

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

import 'package:flutter/material.dart';
import 'package:in_app_file_view/in_app_file_view.dart';
import 'dart:io';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  File? _file;

  @override
  void initState() {
    super.initState();
    // 这里你可以从任何来源获取文件,例如从网络下载或选择本地文件
    _getFile();
  }

  Future<void> _getFile() async {
    // 示例:从一个本地路径加载文件(请确保文件路径正确)
    // 在实际使用中,你可能需要通过文件选择器让用户选择文件
    String filePath = '/path/to/your/file.pdf'; // 替换为你的文件路径
    _file = File(filePath);
    
    // 如果文件不是立即可用的,比如从网络下载,你可以在这里处理异步逻辑
    // 例如使用 `compute` 或其他异步方法来获取文件数据
    
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Preview Example'),
      ),
      body: Center(
        child: _file != null
            ? InAppFileView(
                filePath: _file!.path,
                fileTypeHint: _getFileTypeHint(_file!.path), // 根据文件扩展名提供类型提示
              )
            : CircularProgressIndicator(), // 文件加载时的占位符
      ),
    );
  }

  // 根据文件扩展名提供类型提示
  String? _getFileTypeHint(String filePath) {
    String extension = filePath.split('.').last;
    switch (extension.toLowerCase()) {
      case 'pdf':
        return 'application/pdf';
      case 'jpg':
      case 'jpeg':
        return 'image/jpeg';
      case 'png':
        return 'image/png';
      case 'txt':
        return 'text/plain';
      // 你可以根据需要添加更多文件类型
      default:
        return null; // 如果未知类型,可以返回null,插件将尝试自动检测
    }
  }
}

在这个示例中,_getFile方法模拟了从本地路径加载一个文件。在实际应用中,你可能需要使用文件选择器让用户从设备中选择文件,或者从网络下载文件。_getFileTypeHint方法根据文件扩展名提供类型提示,这有助于插件更好地处理文件预览。

请确保在实际使用中处理文件路径和文件类型的多样性,以及可能的异常情况,例如文件不存在或格式不支持等。

回到顶部