文件视图,支持本地文件与网络链接

Overview

Flutter File View

pub package

Language: 中文 | English

目前该插件仅限于 AndroidiOS 使用

可使用 FileLocalView 实现本地文件预览

可使用 FileNetworkView 实现网络链接下载,结合 FileLocalView 实现预览

第三方插件使用

使用 dio 进行网络请求,v1.0.0版本已不再提供权限请求

本地文件预览

Android 由 Tencent X5 实现,iOS 由 WKWebView 实现

所支持的文件类型

  • Android docx,doc,xlsx,xls,pptx,ppt,pdf,txt
  • IOS docx,doc,xlsx,xls,pptx,ppt,pdf,txt,jpg,jpeg,png

准备工作

版本限制

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

Flutter

flutter_file_view 添加至 pubspec.yaml 引用。

dependencies:
  flutter_file_view: ^latest_version

iOS

请确保将以下键添加到Info.plist

<key>io.flutter.embedded_views_preview</key><true/>

Android

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

在文件 AndroidManifst.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>

使用方法

参数名 类型 描述 默认值
filePath String 本地文件地址(全量地址) 必填项
unSupportPlatformTip String 不支持平台提示 当前仅支持Android、iOS平台
nonExistentFileTip String 文件不存在提示 文件不存在
fileFailTip String 文件打开失败提示 文件打开失败
loadingWidget Widget 加载中的布局 见源文件
unSupportFileWidget Widget 不支持的文件类型布局 见源文件

Android特殊说明

  1. 在插件内已集成加载X5内核方法
  2. 通过getX5Status()可获取当前内核加载状态
  3. 通过initX5(),可自行初始化,主要用于解决下载不成功的问题

注意事项

  1. 不支持Google Play,原因:问题 1.11
  2. 不支持在Android 模拟器
  3. 如果txt文档显示乱码,请将txt文档代码更改为GBK

网络链接视图

基于微信 UI 的 网络链接视图,带有下载功能以及查看的点击效果

使用方法

参数名 类型 描述 默认值
fileShowName String 页面上显示的文件的名称 必填项
fileType String 文件类型 必填项
downloadUrl String 下载文件链接 必填项
downloadPath String 下载文件存储地址 必填项
onViewPressed VoidCallback 文件查看功能 必填项
fileNameStyle TextStyle fileShowName 字体风格 见源文件
downloadTitle Widget 可下载时的按钮标题 文件下载
viewTitle String 可查看时的按钮标题 文件查看
btnTitleColor Color 按钮标题颜色 Colors.white
btnBgColor Color 按钮背景颜色 Theme.of(context).primaryColor
borderSide BorderSide 按钮边框 ElevatedButton 默认
cornerRadius double 按钮四角弧度 ElevatedButton 默认

未来计划

  • 优化Android X5内核的初始化过程,降低失败率
  • 实现Android X5内核的初始化监听
  • 实现网络链接的在线查看,当前可使用 FileNetworkView 实现下载后查看
  • 优化 FileLocalView 加载时的流程,降低卡顿
Comments
  • 2.0.8运行出错

    2.0.8运行出错

    flutter_file_view-2.0.8+3/android/src/main/kotlin/com/file/view/LocalFileViewer.kt: (109, 45): Type mismatch: inferred type is Boolean? but Boolean was expected

    bug 
    opened by zzy080615 3
  • word文档下载后乱码

    word文档下载后乱码

    NetworkFileViewer( downloadUrl: downloadUrl, downloadPath: downloadPath, onViewPressed: () { push(LocalFileViewerPage(downloadPath)); }, )); 下载word文件后,文件内容乱码,需要加什么参数吗?

    opened by andya1985 2
  • 小米手机报错 显示插件加载失败

    小米手机报错 显示插件加载失败

    微信图片_20221105165457 W/System.err( 9156): java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.tencent.tbscommon.plugin.exports.QBPluginItemInfo.mPackageSize' on a null object reference W/System.err( 9156): at com.tencent.tbs.tbsshell.partner.reader.service.l$a.getPackageSize(TbsJavaCore:1) W/System.err( 9156): at com.tencent.mtt.external.reader.internal.v.b(Unknown Source:14) W/System.err( 9156): at com.tencent.mtt.external.reader.internal.t.a(Unknown Source:10) W/System.err( 9156): at com.tencent.mtt.external.reader.internal.l.a(Unknown Source:26) W/System.err( 9156): at com.tencent.mtt.external.reader.internal.l$b.a(Unknown Source:194) W/System.err( 9156): at com.tencent.mtt.external.reader.a.p$c.handleMessage(Unknown Source:11) W/System.err( 9156): at android.os.Handler.dispatchMessage(Handler.java:106) W/System.err( 9156): at android.os.Looper.loop(Looper.java:236) W/System.err( 9156): at android.app.ActivityThread.main(ActivityThread.java:8060) W/System.err( 9156): at java.lang.reflect.Method.invoke(Native Method) W/System.err( 9156): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) W/System.err( 9156): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

    wontfix 
    opened by lumianchan 1
  • file exists, but plugin says it is non-existant.

    file exists, but plugin says it is non-existant.

    I am using this plugin to display files that I have downloaded using http get and saved to local storage. When I give the plugin the directory to look in it says that the file doesn't exist. The path I'm saving the file to looks like this

    /Users/myuser/Library/Developer/CoreSimulator/Devices/BD738457-C105-43FE-A38A-60B401052DDC/data/Containers/Data/Application/AA3FCA19-D06E-4129-917F-39032F261F0C/Documents/67c1dcdf-aea7-406e-a7c6-79f685061751.pdf
    

    the file does exist there and I can open it, but the simulator can't.

    bug 
    opened by DeanPack 1
  •  Error: The getter 'titleMedium' isn't defined for the class 'TextTheme'.

    Error: The getter 'titleMedium' isn't defined for the class 'TextTheme'.

    Error: The getter 'bodyMedium' isn't defined for the class 'TextTheme'.

    • 'TextTheme' is from 'package:flutter/src/material/text_theme.dart' ('../../flutter/packages/flutter/lib/src/material/text_theme.dart'). Try correcting the name to the name of an existing getter, or defining a getter or field named 'bodyMedium'. style: widget.fileSizeStyle ?? Theme.of(context).textTheme.bodyMedium,
    opened by Abdullahfoysal 1
  • java.net.SocketTimeoutException: failed to connect to cfg.imtt.qq.com/13.127.247.216 (port 443) from /192.168.1.51 (port 42096) after 20000ms

    java.net.SocketTimeoutException: failed to connect to cfg.imtt.qq.com/13.127.247.216 (port 443) from /192.168.1.51 (port 42096) after 20000ms

    Failed to initiaize engine.

    W/System.err: java.net.SocketTimeoutException: failed to connect to cfg.imtt.qq.com/13.127.247.216 (port 443) from /192.168.1.51 (port 42096) after 20000ms W/System.err: at libcore.io.IoBridge.connectErrno(IoBridge.java:235) W/System.err: at libcore.io.IoBridge.connect(IoBridge.java:179) W/System.err: at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142) W/System.err: at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390) W/System.err: at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230) W/System.err: at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212) W/System.err: at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436) W/System.err: at java.net.Socket.connect(Socket.java:646) W/System.err: at com.android.okhttp.internal.Platform.connectSocket(Platform.java:182) W/System.err: at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:145) W/System.err: at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116) W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186) W/System.err: at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) W/System.err: at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131) W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:262) W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:219) W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:30) W/System.err: at com.tencent.smtt.utils.g.b(Unknown Source:1) W/System.err: at com.tencent.smtt.utils.g.a(Unknown Source:121) W/System.err: at com.tencent.smtt.sdk.TbsDownloader.b(Unknown Source:519) W/System.err: at com.tencent.smtt.sdk.TbsDownloader.a(Unknown Source:0) W/System.err: at com.tencent.smtt.sdk.TbsDownloader$2.handleMessage(Unknown Source:271) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106) W/System.err: at android.os.Looper.loopOnce(Looper.java:226) W/System.err: at android.os.Looper.loop(Looper.java:313) W/System.err: at android.os.HandlerThread.run(HandlerThread.java:67) W/System.err: org.json.JSONException: Value ["HttpError"] of type org.json.JSONArray cannot be converted to JSONObject W/System.err: at org.json.JSON.typeMismatch(JSON.java:112) W/System.err: at org.json.JSONObject.<init>(JSONObject.java:172) W/System.err: at org.json.JSONObject.<init>(JSONObject.java:185) W/System.err: at com.tencent.smtt.sdk.TbsDownloader.a(Unknown Source:78) W/System.err: at com.tencent.smtt.sdk.TbsDownloader.b(Unknown Source:568) W/System.err: at com.tencent.smtt.sdk.TbsDownloader.a(Unknown Source:0) W/System.err: at com.tencent.smtt.sdk.TbsDownloader$2.handleMessage(Unknown Source:271) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106) W/System.err: at android.os.Looper.loopOnce(Looper.java:226) W/System.err: at android.os.Looper.loop(Looper.java:313) W/System.err: at android.os.HandlerThread.run(HandlerThread.java:67)

    opened by dishant-livebird 2
  • 文件预览时报权限问题android.permission.WRITE_SETTINGS.

    文件预览时报权限问题android.permission.WRITE_SETTINGS.

    为何需要WRITE_SETTINGS权限,是否能去除

    W/System.err(28264): java.lang.SecurityException: com.xxx.xxx was not granted this permission: android.permission.WRITE_SETTINGS. W/System.err(28264): at android.os.Parcel.createException(Parcel.java:2091) W/System.err(28264): at android.os.Parcel.readException(Parcel.java:2059) W/System.err(28264): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188) W/System.err(28264): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140) W/System.err(28264): at android.content.ContentProviderProxy.call(ContentProviderNative.java:658) W/System.err(28264): at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:2372) W/System.err(28264): at android.provider.Settings$System.putStringForUser(Settings.java:2827) W/System.err(28264): at android.provider.Settings$System.putIntForUser(Settings.java:2935) W/System.err(28264): at android.provider.Settings$System.putInt(Settings.java:2928) W/System.err(28264): at com.tencent.mtt.external.reader.internal.x.a(Unknown Source:27) W/System.err(28264): at com.tencent.mtt.external.reader.internal.x.<init>(Unknown Source:32) W/System.err(28264): at com.tencent.mtt.external.reader.a.l.a(Unknown Source:10) W/System.err(28264): at com.tencent.mtt.external.reader.a.k.b(Unknown Source:93) W/System.err(28264): at com.tencent.mtt.external.reader.a.r.b(Unknown Source:0) W/System.err(28264): at com.tencent.mtt.external.reader.a.h.a(Unknown Source:185)

    opened by xingchenwl 9
Releases(2.1.3-alpha.1)
Owner
LiWeNHuI
LiWeNHuI