實(shí)現(xiàn)pdf閱讀、橫豎屏切換,以及pdf頁(yè)面的點(diǎn)擊放大和雙指放大等功能
創(chuàng)新互聯(lián),專注為中小企業(yè)提供官網(wǎng)建設(shè)、營(yíng)銷型網(wǎng)站制作、成都響應(yīng)式網(wǎng)站建設(shè)公司、展示型成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)等服務(wù),幫助中小企業(yè)通過(guò)網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷推廣問(wèn)題。
在這個(gè)項(xiàng)目中使用的是 flutter_plugin_pdf_viewer: ^1.0.7 ,可以滿足我們最基本的pdf需求閱讀需求。所做的滿足項(xiàng)目需求的工作主要是橫豎屏切換功能,以及我們的初始化繼續(xù)閱讀等等。
首先導(dǎo)入插件部分源碼
插件所提供的示例,已經(jīng)滿足了最基本的圖片放大、橫屏閱讀的功能,我們工作的難點(diǎn)就在于pdf豎屏閱讀的實(shí)現(xiàn),所以我們需要解決的問(wèn)題主要有以下幾點(diǎn):
(1) 橫屏加載同一頁(yè)面不能重復(fù)流量加載
(2) 切換豎屏?xí)r加載速度不能過(guò)慢,頁(yè)面不能有斷層
(3) 橫豎屏切換時(shí)頁(yè)碼的定位保持
針對(duì)于上述問(wèn)題,我們一一進(jìn)行解決。
重復(fù)流量加載 ,解決這一問(wèn)題比較簡(jiǎn)單,我們可以利用緩存實(shí)現(xiàn),在每一次加載pdf頁(yè)時(shí),存儲(chǔ)其(key,value),這樣在下一次加載時(shí)我們會(huì)判斷這個(gè)頁(yè)面在緩存中是否已經(jīng)存在,不存在重新加載,存在則調(diào)用緩存中的數(shù)據(jù),頁(yè)面銷毀時(shí)清除所有緩存即可。
切換橫豎屏 ,豎屏PDF閱讀的實(shí)現(xiàn),思路就是將所有橫屏頁(yè)面存在list中,使用LIstView.builder()進(jìn)行繪制,這種方法存在的缺點(diǎn)就是太慢了,需要將所有頁(yè)面全部加載之后,才可以繪制頁(yè)面,用戶體驗(yàn)非常差,所以我們需要做一些改進(jìn),為了提升加載速度,實(shí)現(xiàn)效果GIF中的效果,我們就要使用FutureBuilder()方法,來(lái)實(shí)現(xiàn)預(yù)加載功能,具體實(shí)現(xiàn)如下:
(在這里不對(duì)此組件過(guò)多介紹,后續(xù)會(huì)專門介紹此組件的使用),這樣我們就可以實(shí)現(xiàn)預(yù)加載的功能了。
橫豎屏切換定位 ,這個(gè)點(diǎn)的解決思路已經(jīng)在我的 (Flutter 初始化ListView定位子組件位置) 中進(jìn)行了介紹,實(shí)現(xiàn)了解決。
至此,我們就解決了所有的難點(diǎn)問(wèn)題。
這種方法最常見(jiàn),但是有些地方引用的話,刷新的成本比較大,刷新的是整個(gè)頁(yè)面,數(shù)據(jù)太多加載太慢的話,會(huì)有閃爍的現(xiàn)象
這種方法類似于iOS中的set方法,通過(guò)設(shè)置某個(gè)屬性的時(shí)候,去刷新某個(gè)控件。在flutter中這種刷新方式,是對(duì)上面setState(){}方法的改進(jìn),根本的方法還是setState(){},只不過(guò)是通過(guò)方法去刷新某個(gè)控件。如下:
首先在pubspec.yaml中添加provider依賴
下面通過(guò)provider來(lái)實(shí)現(xiàn)一個(gè)發(fā)送驗(yàn)證碼的案例。
創(chuàng)建一個(gè)TimerModel文件
頁(yè)面布局如下:
flutter加載h5很卡的解決方法如下:
一種臨時(shí)解決方案,在切換動(dòng)畫加載完畢后,再去構(gòu)造 WebView,這樣從用戶角度上看,就不會(huì)有路由切換動(dòng)畫的卡頓了。class WebViewPage extends StatefulWidget {undefined
final String uri;
WebViewPage({undefined
@required this.uri,
}) : assert(uri != null);
@override
_WebViewPageState createState() = _WebViewPageState();
}
class _WebViewPageState extends State {undefined
WebViewController _controller;
bool _animationCompleted = false;
@override
Widget build(BuildContext context) {undefined
// 主要是下面的代碼
var route = ModalRoute.of(context);
if (route != null !_animationCompleted) {undefined
void handler(status) {undefined
if (status == AnimationStatus.completed) {undefined
route.animation.removeStatusListener(handler);
setState(() {undefined
_animationCompleted = true;
});
}
}
route.animation.addStatusListener(handler);
}
return Scaffold(
title: widget.title,
backgroundColor: Colors.white,
body: _animationCompleted
? WebView(
initialUrl: 'about:blank',
onWebViewCreated: (WebViewController webViewController) {undefined
_controller = webViewController;
_loadHtmlFromAssets();
},
)
: Container(),
);
}
_loadHtmlFromAssets() async {undefined
var uri = Uri.dataFromString(
await rootBundle.loadString(widget.uri),
mimeType: 'text/html',
encoding: Encoding.getByName('utf-8'),
).toString();
_controller.loadUrl(uri);
}
}
Fluent是目前國(guó)際上比較流行的商用CFD軟件包,在美國(guó)的市場(chǎng)占有率為60%,凡是和流體、熱傳遞和化學(xué)反應(yīng)等有關(guān)的工業(yè)均可使用。
它具有豐富的物理模型、先進(jìn)的數(shù)值方法和強(qiáng)大的前后處理功能,在航空航天、汽車設(shè)計(jì)、石油天然氣和渦輪機(jī)設(shè)計(jì)等方面都有著廣泛的應(yīng)用。
FLUENT軟件包含基于壓力的分離求解器、基于密度的隱式求解器、基于密度的顯式求解器,多求解器技術(shù)使FLUENT軟件可以用來(lái)模擬從不可壓縮到高超音速范圍內(nèi)的各種復(fù)雜流場(chǎng)。
FLUENT軟件包含非常豐富、經(jīng)過(guò)工程確認(rèn)的物理模型,由于采用了多種求解方法和多重網(wǎng)格加速收斂技術(shù),因而FLUENT能達(dá)到最佳的收斂速度和求解精度。
靈活的非結(jié)構(gòu)化網(wǎng)格和基于解的自適應(yīng)網(wǎng)格技術(shù)及成熟的物理模型,可以模擬高超音速流場(chǎng)、傳熱與相變、化學(xué)反應(yīng)與燃燒、多相流、旋轉(zhuǎn)機(jī)械、動(dòng)/變形網(wǎng)格、噪聲、材料加工等復(fù)雜機(jī)理的流動(dòng)問(wèn)題。
文章轉(zhuǎn)自:
用Android Stduio創(chuàng)建Flutter項(xiàng)目的時(shí)候,會(huì)出現(xiàn)各種問(wèn)題,踩了一個(gè)又一個(gè),最后編譯的時(shí)候可能會(huì)出現(xiàn)一直顯示Running Gradle task 'assembleDebug'然后就不動(dòng)了,或者會(huì)顯示Could not resolve io.flutter等問(wèn)題,歸根結(jié)底是網(wǎng)絡(luò)無(wú)法訪問(wèn)到Google服務(wù)引起的,兩種解決方案:
1.具有比較良好的訪問(wèn)谷歌的網(wǎng)絡(luò)環(huán)境
2.修改鏡像源為國(guó)內(nèi)的:
找到Flutte SDK目錄下的Flutter打包配置文件flutter.gradle
路徑為flutter\packages\flutter_tools\gradle\flutter.gradle
第一處配置:
buildscript {
repositories {
//注釋
// google()
// jcenter()
//添加
maven { url ' ' }
maven { url ' ' }
maven { url ' ' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
第二處配置:
class FlutterPlugin implements PluginProject {
//注釋
// private static final String MAVEN_REPO = " ";
//添加這行
private static final String MAVEN_REPO = " ";
第三處配置:
void addFlutterDependencies(buildType) {
String flutterBuildMode = buildModeFor(buildType)
if (!supportsBuildMode(flutterBuildMode)) {
return
}
String repository = useLocalEngine()
? project.property('local-engine-repo')
: MAVEN_REPO
最后一處,項(xiàng)目中的配置,修改Flutter項(xiàng)目下的android下的build.gradle:
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
// google()
// jcenter()
maven { url ' ' }
maven { url ' ' }
maven { url ' ' }
}
}
allprojects {
repositories {
// google()
// jcenter()
maven { url ' ' }
maven { url ' ' }
maven { url ' ' }
}
}
修改完成后,再build,就可以正常構(gòu)建了!??!
本文對(duì)比的是 UIWebView、WKWebView、flutter_webview_plugin(在iOS中使用的是WKWebView)的加載速度,內(nèi)存使用情況。
測(cè)試網(wǎng)頁(yè)打開的速度,只需要獲取 WebView 在開始加載網(wǎng)頁(yè)和網(wǎng)頁(yè)加載完成時(shí)的時(shí)間戳,時(shí)間戳的差即為打開網(wǎng)頁(yè)的時(shí)間
為了使差異更明顯,我們選擇較為復(fù)雜的 新浪首頁(yè) 進(jìn)行加載的對(duì)比,為了減小網(wǎng)絡(luò)對(duì)加載速度的影響,我們讓手機(jī)連接同一個(gè)網(wǎng)絡(luò),分別進(jìn)行 10 次測(cè)試然后取平均值,另外,我們需要關(guān)閉 WebView 的緩存,防止緩存對(duì)加載速度產(chǎn)生影響
下面使筆者進(jìn)行 10 次測(cè)試所得到的數(shù)據(jù)
結(jié)果讓我有點(diǎn)驚訝,一直以為 WKWebView 會(huì)是個(gè)王者。結(jié)果看,速度上 WKWebView 略慢一點(diǎn),不過(guò)總體差異不大(該結(jié)果僅僅是測(cè)試新浪的結(jié)果,僅供參考啦)
在這里,筆者又加了一個(gè)測(cè)試,嘗試記錄從 viewController 的 viewDidLoad 到 webview 的 didFinish 時(shí)間,測(cè)試了新浪的數(shù)據(jù),如下:
UIWebViewA : 4970、3808、3815、4250、3556 avg(4079.8) (加載完所有頁(yè)面)
UIWebViewB : 4103、3124、3070、3256、2835 avg(3277.6)(加載sina完畢)
WKWebView : 3672、3032、2892、2912、2739 avg(3049.4)
flutter_webView : 4532、3901、4310、3496、3378 avg(3923.4)
其中可以看到,webView 有兩行,UIWebViewB 的數(shù)據(jù)就是加載 sina 主站的時(shí)間;UIWebViewA 的數(shù)據(jù)是因?yàn)樵诩虞d完 sina 主站之后,新浪又加載了一個(gè) ,所以導(dǎo)致總時(shí)間延長(zhǎng),不過(guò)即使按照 UIWebViewB 的數(shù)據(jù)來(lái)比較,也是 wkWebView 略勝一籌。
此處可以看出 flutter_webView 使用的是 wkwebView,所以它吃虧的主要原因是 flutter 包了一層。
結(jié)論:
速度(didStart - didFinish) UIWebView flutter_webview WKWebView
速度(viewDidLoad - didFinish)WKWebView UIWebView flutter_webview
這里查看內(nèi)存使用的是 xcode 的 debug session 中的 memory。
首先看之前測(cè)試時(shí),連續(xù)打開十次新浪的內(nèi)存情況
接著我們?cè)诳匆幌麓蜷_淘寶首頁(yè)的內(nèi)存情況
從圖上可以看出,WKWebView 在內(nèi)存方面有很大的優(yōu)勢(shì)啊,UIWebView 的內(nèi)存是真的傷啊,然后 debug 看了一下 flutter_webView,他使用的就是原生的 webView 。
他相比較原生 WKWebView 的內(nèi)存開銷稍大一點(diǎn),從測(cè)試表現(xiàn)來(lái)看,一般大個(gè) 30 MB 左右。
結(jié)論:內(nèi)存 WKWebView flutter_webview UIWebView
可以在 html5test 中對(duì)瀏覽器的兼容性進(jìn)行評(píng)分,通過(guò)測(cè)試發(fā)現(xiàn)得分分別如下
因?yàn)?flutter 里使用的就是 WK,所以和原生的 WKWebView 一樣都是 444 分,比 UIWebView 的 437 略勝一籌
結(jié)論:兼容性 WKWebView = flutter_webview UIWebView
UIWebView : 速度相比較 WKWebView 稍快一點(diǎn),但是內(nèi)存是一大硬傷,所以只要條件允許,就不推薦使用了
WKWebView : 速度略慢一點(diǎn),不過(guò)差別不大,總體可以接受。是比UIWebView更好的選擇,推薦使用。
flutter_webView_plugin :在iOS中使用的就是原生的WKWebView,所以總體和 native WKWebView 表現(xiàn)差不多。如果是混編項(xiàng)目中,因?yàn)樗话艘粚?,所以?yè)面加載上存在一定的劣勢(shì),所以混編項(xiàng)目中仍然推薦使用 WKWebView。不過(guò)如果從多端考慮、以及項(xiàng)目可遷移等,那么使用也未嘗不可,就是維護(hù)成本要增加一些,需要維護(hù)兩套 webView。這個(gè)就需要根據(jù)自己的情況自己取舍了。
記錄下坑
一開始我就使用Future、async、await去做異步操作,以為這樣能解決問(wèn)題,經(jīng)過(guò)一天研究發(fā)現(xiàn)他們都還在同一個(gè)線程里面,也就是UI線程,導(dǎo)致卡頓,這明顯不是我們想要的異步加載數(shù)據(jù)。
Dart真正的線程叫隔離(Isolate)
難受香菇
有點(diǎn)心累,記錄下吧。
網(wǎng)頁(yè)題目:flutter加載速度,flutter 幀率
當(dāng)前路徑:http://aaarwkj.com/article34/dsiscpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、軟件開發(fā)、虛擬主機(jī)、定制網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)