最近一個(gè)項(xiàng)目要實(shí)現(xiàn)可以無(wú)限循環(huán)的PageView,主要思路是在初始化pageview的list的時(shí)候在開(kāi)始和結(jié)尾多加一個(gè)結(jié)尾和開(kāi)頭的widget,當(dāng)滑動(dòng)到開(kāi)頭和結(jié)尾的時(shí)候手動(dòng)進(jìn)行頁(yè)面的切換,詳細(xì)可以搜索pageview無(wú)限輪播。
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的洪江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
這種方法有一個(gè)要點(diǎn)就是要維護(hù)兩個(gè)索引,一個(gè)是內(nèi)部list的索引,一個(gè)是外部顯示的索引,由于list的容量是比顯示的數(shù)量多2的,所以如果要在外部進(jìn)行一些比如指示器或者計(jì)時(shí)器功能要進(jìn)行和頁(yè)面同步顯示或者切換頁(yè)面操作時(shí),需要將顯示的索引轉(zhuǎn)換成list的索引。
不過(guò)網(wǎng)上說(shuō)的都是一些比較簡(jiǎn)單的實(shí)現(xiàn),看到比較多的就是當(dāng)滑動(dòng)到要手動(dòng)切換的時(shí)候進(jìn)行一個(gè)時(shí)延,這樣可以避免直接切換頁(yè)面造成的卡頓和跳動(dòng)現(xiàn)象。但是存在一個(gè)問(wèn)題,如果要同時(shí)實(shí)現(xiàn)一個(gè)跟隨頁(yè)面切換的指示器,就會(huì)出現(xiàn)當(dāng)頁(yè)面切換過(guò)去之后指示器才會(huì)跟著過(guò)去,因?yàn)轫?yè)面切換的時(shí)候執(zhí)行了時(shí)延,而時(shí)延之后才會(huì)真正改變索引,此時(shí)才會(huì)setstate,之后指示器才能響應(yīng)到索引的切換,但是如果在時(shí)延之前就切換的話又會(huì)出現(xiàn)指示器先行的情況。因此這種方法其實(shí)是存在一些問(wèn)題的。
所以解決這個(gè)問(wèn)題的關(guān)鍵在于如何進(jìn)行頁(yè)面切換的判斷。這里可以有兩種思路實(shí)現(xiàn),第一種是實(shí)現(xiàn)viewpage的onpagechanged方法,在里面進(jìn)行邏輯的判斷,然后用controller來(lái)進(jìn)行頁(yè)面跳轉(zhuǎn),不過(guò)這種方法存在當(dāng)controller跳轉(zhuǎn)的時(shí)候又會(huì)回調(diào)onpagechanged,所以就會(huì)出現(xiàn)多次對(duì)索引不必要操作,而且如果有比如計(jì)時(shí)器等額外的功能的話可能不方便將頁(yè)面邏輯分開(kāi),而且依舊無(wú)法解決指示器延遲問(wèn)題,同時(shí)也很難進(jìn)行細(xì)粒度的操作。
第二種方法我們就要去看pageview的源碼了,從源碼的角度來(lái)解決問(wèn)題才是正確的方法。首先我們點(diǎn)進(jìn)去pageview的源碼
看到這里其實(shí)已經(jīng)有一些思路了,我們之前難點(diǎn)在于重寫了onpagechanged方法導(dǎo)致問(wèn)題無(wú)法很好的解決,現(xiàn)在我們找到了onpagechanged調(diào)用的地方,只要找辦法避免掉就可以實(shí)現(xiàn)了。
當(dāng)然這里我們要說(shuō)到NotificationListener,以及flutter對(duì)應(yīng)的冒泡事件傳輸機(jī)制,這里大家可以去看看這篇 文章 。
我來(lái)總結(jié)一下,其實(shí)就是flutter對(duì)于notification這個(gè)組件,有一中事件規(guī)則叫冒泡傳遞,底層的notification如果在它的 onNotification寫的邏輯中返回是false以及它不是根結(jié)點(diǎn),就會(huì)去向上遍歷尋找它的祖先notification組件,知道遇到root節(jié)點(diǎn)或者某一個(gè)返回true,則事件傳遞結(jié)束。
而且在onNotification中可以對(duì)多種事件進(jìn)行監(jiān)聽(tīng)和處理,所以我們可以把對(duì)viewpage頁(yè)面跳轉(zhuǎn)對(duì)索引處理的邏輯寫在這里,而且我們可以分別處理比如滑動(dòng)開(kāi)始的start事件和結(jié)束的end事件,分別進(jìn)行細(xì)粒度的邏輯的處理,這樣就可以在外部進(jìn)行操作和別的功能實(shí)現(xiàn)了。
因此不僅無(wú)限輪播事件可以通過(guò)這種方法來(lái)解決,如果有其他的操作也可以這樣進(jìn)行處理,而且因?yàn)槲覀儧](méi)有傳入onpagechanged方法,所以不存在多次調(diào)用的問(wèn)題,pageview那里判斷onpagechanged是null方法就不會(huì)進(jìn)去了,會(huì)直接我們寫在pageview外面的notification的邏輯。
最后的結(jié)構(gòu)大概這樣
對(duì)于零基礎(chǔ)的小白,小蝸這里整理了一份web前端系統(tǒng)的學(xué)習(xí)路線,不知道如何學(xué)習(xí)的可參照這份大綱進(jìn)行學(xué)習(xí)規(guī)劃:
第一階段:專業(yè)核心基礎(chǔ)
階段目標(biāo):
1. 熟練掌握HTML5、CSS3、Less、Sass、響應(yīng)書布局、移動(dòng)端開(kāi)發(fā)。
2. 熟練運(yùn)用HTML+CSS特性完成頁(yè)面布局。
4. 熟練應(yīng)用CSS3技術(shù),動(dòng)畫、彈性盒模型設(shè)計(jì)。
5. 熟練完成移動(dòng)端頁(yè)面的設(shè)計(jì)。
6. 熟練運(yùn)用所學(xué)知識(shí)仿制任意Web網(wǎng)站。
7. 能綜合運(yùn)用所學(xué)知識(shí)完成網(wǎng)頁(yè)設(shè)計(jì)實(shí)戰(zhàn)。
知識(shí)點(diǎn):
1、Web前端開(kāi)發(fā)環(huán)境,HTML常用標(biāo)簽,表單元素,Table布局,CSS樣式表,DIV+CSS布局。熟練運(yùn)用HTML和CSS樣式屬性完成頁(yè)面的布局和美化,能夠仿制任意網(wǎng)站的前端頁(yè)面實(shí)現(xiàn)。
2、CSS3選擇器、偽類、過(guò)渡、變換、動(dòng)畫、字體圖標(biāo)、彈性盒模型、響應(yīng)式布局、移動(dòng)端。熟練運(yùn)用CSS3來(lái)開(kāi)發(fā)網(wǎng)頁(yè)、熟練開(kāi)發(fā)移動(dòng)端,整理網(wǎng)頁(yè)開(kāi)發(fā)技巧。
3、預(yù)編譯css技術(shù):less、sass基礎(chǔ)知識(shí)、以及插件的運(yùn)用、BootStrap源碼分析。能夠熟練使用 less、sass完成項(xiàng)目開(kāi)發(fā),深入了解BootStrap。
4、使用HTML、CSS、LESS、SASS等技術(shù)完成網(wǎng)頁(yè)項(xiàng)目實(shí)戰(zhàn)。通過(guò)項(xiàng)目掌握第一階段html、css的內(nèi)容、完成PC端頁(yè)面設(shè)計(jì)和移動(dòng)端頁(yè)面設(shè)計(jì)。
第二階段:Web后臺(tái)技術(shù)
階段目標(biāo):
1. 了解JavaScript的發(fā)展歷史、掌握Node環(huán)境搭建及npm使用。
2. 熟練掌握J(rèn)avaScript的基本數(shù)據(jù)類型和變量的概念。
3. 熟練掌握J(rèn)avaScript中的運(yùn)算符使用。
4. 深入理解分之結(jié)構(gòu)語(yǔ)句和循環(huán)語(yǔ)句。
5. 熟練使用數(shù)組來(lái)完成各種練習(xí)。
6.熟悉es6的語(yǔ)法、熟練掌握J(rèn)avaScript面向?qū)ο缶幊獭?/p>
7.DOM和BOM實(shí)戰(zhàn)練習(xí)和H5新特性和協(xié)議的學(xué)習(xí)。
知識(shí)點(diǎn):
1、軟件開(kāi)發(fā)流程、算法、變量、數(shù)據(jù)類型、分之語(yǔ)句、循環(huán)語(yǔ)句、數(shù)組和函數(shù)。熟練運(yùn)用JavaScript的知識(shí)完成各種練習(xí)。
2、JavaScript面向?qū)ο蠡A(chǔ)、異常處理機(jī)制、常見(jiàn)對(duì)象api,js的兼容性、ES6新特性。熟練掌握J(rèn)avaScript面向?qū)ο蟮拈_(kāi)發(fā)以及掌握es6中的重要內(nèi)容。
3、BOM操作和DOM操作。熟練使用BOM的各種對(duì)象、熟練操作DOM的對(duì)象。
4、h5相關(guān)api、canvas、ajax、數(shù)據(jù)模擬、touch事件、mockjs。熟練使用所學(xué)知識(shí)來(lái)完成網(wǎng)站項(xiàng)目開(kāi)發(fā)。
第三階段:數(shù)據(jù)庫(kù)和框架實(shí)戰(zhàn)
階段目標(biāo):
1. 綜合運(yùn)用Web前端技術(shù)進(jìn)行頁(yè)面布局與美化。
2. 綜合運(yùn)用Web前端開(kāi)發(fā)框架進(jìn)行Web系統(tǒng)開(kāi)發(fā)。
3. 熟練掌握Mysql、Mongodb數(shù)據(jù)庫(kù)的發(fā)開(kāi)。
4. 熟練掌握vue.js、webpack、elementui等前端框技術(shù)。
5. 熟練運(yùn)用Node.js開(kāi)發(fā)后臺(tái)應(yīng)用程序。
6. 對(duì)Restful,Ajax,JSON,開(kāi)發(fā)過(guò)程有深入的理解,掌握git的基本技能。
知識(shí)點(diǎn):
1、數(shù)據(jù)庫(kù)知識(shí),范式,MySQL配置,命令,建庫(kù)建表,數(shù)據(jù)的增刪改查,mongodb數(shù)據(jù)庫(kù)。深入理解數(shù)據(jù)庫(kù)管理系統(tǒng)通用知識(shí)及MySQL數(shù)據(jù)庫(kù)的使用與管理,為Node.js后臺(tái)開(kāi)發(fā)打下堅(jiān)實(shí)基礎(chǔ)。
2、模塊系統(tǒng),函數(shù),路由,全局對(duì)象,文件系統(tǒng),請(qǐng)求處理,Web模塊,Express框架,MySQL數(shù)據(jù)庫(kù)處理,RestfulAPI,文件上傳等。熟練運(yùn)用Node.js運(yùn)行環(huán)境和后臺(tái)開(kāi)發(fā)框架完成Web系統(tǒng)的后臺(tái)開(kāi)發(fā)。
3、vue的組件、生命周期、路由、組件、前端工程化、webpack、elementui框架。Vue.js框架的基本使用有清晰的理解,能夠運(yùn)用Vue.js完成基礎(chǔ)前端開(kāi)發(fā)、熟練運(yùn)用Vue.js框架的高級(jí)功能完成Web前端開(kāi)發(fā)和組件開(kāi)發(fā),對(duì)MVVM模式有深刻理解。
4、需求分析,數(shù)據(jù)庫(kù)設(shè)計(jì),后臺(tái)開(kāi)發(fā),使用vue、node完成pc和移動(dòng)端整站開(kāi)發(fā)。于Node.js+Vue.js+Webpack+Mysql+Mongodb+Git,實(shí)現(xiàn)整站項(xiàng)目完整功能并上線發(fā)布。
第四階段:移動(dòng)端和微信實(shí)戰(zhàn)
階段目標(biāo):
1.熟練掌握React.js框架,熟練使用React.js完成開(kāi)發(fā)。
2.掌握移動(dòng)端開(kāi)發(fā)原理,理解原生開(kāi)發(fā)和混合開(kāi)發(fā)。
3.熟練使用react-native和Flutter框架完成移動(dòng)端開(kāi)發(fā)。
4.掌握微信小程序以及了解支付寶小程序的開(kāi)發(fā)。
5.完成大型電商項(xiàng)目開(kāi)發(fā)。
知識(shí)點(diǎn):
1、React面向組件編程、表單數(shù)據(jù)、組件通信、監(jiān)聽(tīng)、聲明周期、路由、Redux基本概念。練使用react完成項(xiàng)目開(kāi)發(fā)、掌握Redux中的異步解決方案Saga。
2、react-native、開(kāi)發(fā)工具、視圖與渲染、api操作、Flutter環(huán)境搭建、路由、ListView組件、網(wǎng)絡(luò)請(qǐng)求、打包。練掌握react-native和Flutter框架,并分別使用react-native和Flutter分別能開(kāi)發(fā)移動(dòng)端項(xiàng)目。
3、微信小程序基本介紹、開(kāi)發(fā)工具、視圖與渲染、api操作、支付寶小程序的入門和api學(xué)習(xí)。掌握微信小程序開(kāi)發(fā)了解支付寶小程序。
4、大型購(gòu)物網(wǎng)站實(shí)戰(zhàn),整個(gè)項(xiàng)目前后端分離開(kāi)發(fā);整個(gè)項(xiàng)目分為四部分:PC端網(wǎng)頁(yè)、移動(dòng)端APP、小程序、后臺(tái)管理。團(tuán)隊(duì)協(xié)作開(kāi)發(fā),使用git進(jìn)行版本控制。目期間可以擴(kuò)展Three.js 、TypeScript。
1. div和table
這個(gè)是最簡(jiǎn)單的,也是最基礎(chǔ)的。要熟練掌握div、form table、ul li 、p、span、font這些標(biāo)簽,這些都是最常用的,特別是div和table,div用于布局、table也可以用于布局,但是不靈活,基本 table是用來(lái)和數(shù)據(jù)打交道。
2.html
HTML是指超文本標(biāo)簽語(yǔ)言,是目前web領(lǐng)域應(yīng)用廣泛的語(yǔ)言,我們只需要在html文檔中插入對(duì)應(yīng)的標(biāo)簽,即可實(shí)現(xiàn)web頁(yè)面的編寫與排列,所以要熟練掌握HTML基本知識(shí),包括每個(gè)標(biāo)簽的用法等。
3. CSS
CSS指層疊樣式表,可以為HTML標(biāo)簽自定義樣式,通過(guò)設(shè)置HTML標(biāo)簽的樣式,來(lái)改變其外形,達(dá)到美化與排版web頁(yè)面的目的。
4.Javascript
Javascript是網(wǎng)頁(yè)腳本語(yǔ)言,它可以在html中運(yùn)行,設(shè)置并修改瀏覽器中的各種對(duì)象與變量。例如用來(lái)改進(jìn)設(shè)計(jì)、驗(yàn)證表單、檢測(cè)瀏覽器、創(chuàng)建 cookies等等,現(xiàn)在各大網(wǎng)站都可以看見(jiàn) Javascript的蹤影,常見(jiàn)的網(wǎng)站首頁(yè)大眼晴、警告提示框、頁(yè)面動(dòng)畫效果等等。Javascript更是一種在客戶端廣泛使用的腳步語(yǔ)言,在 Javascript當(dāng)中提供了一些內(nèi)置函數(shù)、對(duì)象和DOM操作,借助這些內(nèi)容我們可以來(lái)實(shí)現(xiàn)一些客戶端的特效、驗(yàn)證、交互等!
5.Jquery
Jquery是相當(dāng)于把js封裝了一套的一個(gè)js插件,目的就是操作起來(lái)更方便,代碼寫的更少。 Jquery是一個(gè)免費(fèi)、開(kāi)源的輕量級(jí)的Javascript庫(kù),并且兼容各種瀏覽器,同時(shí)現(xiàn)在有很多基于 Jquery的插件可供選擇,這樣在我們實(shí)現(xiàn)一些豐富的動(dòng)態(tài)效果時(shí)更方便快捷,大大節(jié)省了我們開(kāi)發(fā)的時(shí)間,提高了開(kāi)發(fā)速度。
6.框架
從 bootstrap開(kāi)始,響應(yīng)式的珊格系統(tǒng)被后來(lái)框架一直沿用,建議學(xué)一套主流mvc框架,vue,react, angular兩選一種。
7.會(huì)點(diǎn)后臺(tái)語(yǔ)言
對(duì)于前端工程師來(lái)說(shuō),并不需要像網(wǎng)站程序員樣,編寫對(duì)象、開(kāi)發(fā)特殊功能、搭建數(shù)據(jù)庫(kù)。但是前端工程師要掌握基本的頁(yè)面GET&POST傳參、程序判斷語(yǔ)法、程序輸出語(yǔ)法、頁(yè)面提交、數(shù)據(jù)庫(kù)查詢與記錄插入,以及掌握HTTP與WEB工作原理、掌握Socket長(zhǎng)連接實(shí)時(shí)網(wǎng)絡(luò)通信技術(shù)、掌握 NOSQL中的 MONGODB的應(yīng)用、了解PHP語(yǔ)法、了解 MYSQL數(shù)據(jù)庫(kù)的基本操作。
當(dāng)然,以上技能能夠幫助你成為一個(gè)合格的前端工程師,但要成為一個(gè)優(yōu)秀的前端,必須掌握除技術(shù)以外的東西,例如設(shè)計(jì),用戶等等,因此還需不斷的堅(jiān)持學(xué)習(xí)。
實(shí)現(xiàn)pdf閱讀、橫豎屏切換,以及pdf頁(yè)面的點(diǎ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)題。
網(wǎng)站題目:flutter難點(diǎn),flutter特點(diǎn)
本文地址:http://vcdvsql.cn/article46/dsigshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航
聲明:本網(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)