Flutter插件是Flutter調(diào)用原生能力的一種解構(gòu)方式。

十年的大豐網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整大豐建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“大豐網(wǎng)站設(shè)計(jì)”,“大豐網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Flutter 會(huì)通過(guò) MethodChannel 將數(shù)據(jù)傳遞給 iOS/ Android ,反之 iOS/ Android 也可以通過(guò) MethodChannel 將數(shù)據(jù)傳回給 Flutter。
在Flutter工程根目錄創(chuàng)建plugins目錄,在plugins目錄下執(zhí)行下面命令:
Flutter-Native
Native-Flutter
new flutter project,選擇Flutter Plugin,next,輸入插件名,包名,運(yùn)行平臺(tái)及編寫(xiě)語(yǔ)言,finish!
如上圖,筆者的插件名為log_plugin,選用Android,java語(yǔ)言開(kāi)發(fā)
在自動(dòng)打開(kāi)和插件名同名的dart文件,聲明要使用其他語(yǔ)言的方法,本例使用java 語(yǔ)言實(shí)現(xiàn)Android原生的log輸出
編輯 android/src/main/java/com/whh/log_plugin/LogPlugin.java
在onMethodCall方法中,區(qū)別聲明方法名,以實(shí)現(xiàn)該方法邏輯
至此,簡(jiǎn)單的插件開(kāi)發(fā)完成,接下來(lái)測(cè)試
example是插件測(cè)試工程,打開(kāi)其中的main.dart
打開(kāi)已有的或者新建一個(gè)flutter app project,在其pubspec.yaml引入插件
使用pub get 關(guān)聯(lián)到插件
詳見(jiàn)官網(wǎng)文檔
此文為 flutter 初學(xué)者記錄學(xué)習(xí)過(guò)程,附上 github ,小小分享~
每天進(jìn)步一點(diǎn)點(diǎn)。。。(2021-08-10)
? ? 盡可能收集好用的插件以便更快的開(kāi)發(fā)效率,85%親測(cè),持續(xù)添加中
如果有好的插件或者建議,可以直接評(píng)論 ??
Github地址:
文章源地址:
br /
???????? 盡可能收集好用的插件以便更效率的開(kāi)發(fā),85%親測(cè),持續(xù)添加中
br /
br /
如果有好的插件或者建議,可直接提Issue 感謝您的分享 ~ ??
br /
br /
掘金文章地址:
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
br /
注:亮度調(diào)節(jié)和音量調(diào)節(jié)gif無(wú)法體現(xiàn),功能是ok的,其次默認(rèn)Icon鎖的close和open實(shí)在難以分辨。
環(huán)境:Flutter 2.8.1 channel stable ;Dart 2.15.1
需要音頻播放器的看這里: Flutter音樂(lè)播放器
重點(diǎn)說(shuō)下這個(gè)工具類,因?yàn)橐曨l播放,涉及到狀態(tài)改變有很多,筆者剛開(kāi)始選擇使用 InheritedWidget 來(lái)在眾多的widget之間共享數(shù)據(jù)。但是總感覺(jué)這樣有點(diǎn)繁瑣,且不很優(yōu)雅!
這里非廣告,如果是使用 GetX 就很簡(jiǎn)單了,筆者也使用了 GetX 進(jìn)行封裝了,一瀉千里的趕腳!,但是筆者還是那句話:剛開(kāi)始接觸Flutter的開(kāi)發(fā)者不是很建議使用 GetX ,可以先熟悉下Flutter狀態(tài)管理的基礎(chǔ)原理再行使用。而且為了盡量簡(jiǎn)潔,還是不引入其他的第三方了。
我們選擇對(duì)第三方插件進(jìn)行封裝的目的不外乎這幾個(gè):
于是筆者就寫(xiě)了一個(gè)工具類 VideoPlayerUtils ,專門且只用來(lái)處理播放器的所有業(yè)務(wù)。包括暫停、播放、跳轉(zhuǎn)、調(diào)節(jié)音量、調(diào)節(jié)亮度、切換視頻等操作。在所有的widget中不會(huì)引用關(guān)于 video_player 或其他第三方插件的任何信息, VideoPlayerUtils 負(fù)責(zé)widget與播放器之間的所有操作交互。后續(xù)優(yōu)化迭代或更換播放器插件時(shí),只需針對(duì)這個(gè)工具類進(jìn)行修改,對(duì)所有widget不會(huì)有任何的影響,大大的解耦合了。
其中 VideoPlayerState :
提供以上的公共屬性,可以通過(guò) VideoPlayerUtils 來(lái)獲取對(duì)應(yīng)的值,使用 get 只讀,使外界不會(huì)誤修改這些屬性,以保證數(shù)值的安全性。開(kāi)發(fā)者可根據(jù)自身需要自行添加屬性。
提供以上方法來(lái)處理播放器的所有業(yè)務(wù)。同樣的開(kāi)發(fā)者可根據(jù)自身需要自行添加或修改。
重點(diǎn)說(shuō)下這個(gè)方法,是整個(gè)業(yè)務(wù)的核心方法,控制視頻的播放或暫停。開(kāi)發(fā)者只要遇到播放或暫停是均可調(diào)用此方法,具體是播放或暫停,內(nèi)部根據(jù)傳入的 url 自行判斷,開(kāi)發(fā)者不需要關(guān)心。
切換新視頻也是使用此方法,傳入的 url 與上次不一致,自動(dòng)切換新視頻。筆者可根據(jù) statusListener 來(lái)監(jiān)聽(tīng)播放狀態(tài)的改變,以此處理自身邏輯。
這個(gè)也需要提下,視頻播放器在播放新視頻時(shí)會(huì)異步初始化,一般我們的操作是在 initState() 初始化,成功后再 setState() 。這里筆者遇到一個(gè)讓人蛋疼的問(wèn)題:
我們看 video_player 的使用:
VideoPlayer(controller) :widget中已經(jīng)持有了controller。本來(lái)筆者封裝的目的就是為了讓widget與controller的之間解耦合。但此時(shí)的筆者。。。。
放棄不是不可能放棄的,這輩子都不會(huì)放棄的!
于是筆者取了巧,寫(xiě)了一個(gè)初始化監(jiān)聽(tīng)器 initializedListener ,包換2個(gè)參數(shù): bool,Widget ,初始化是否成功;其中widget為初始化成功返回需要展示的播放器UI,失敗默認(rèn)返回 const SizedBox() 。
到這里就可以簡(jiǎn)單使用了:
沒(méi)看錯(cuò),視頻播放就是這么簡(jiǎn)單。
如果有更多的業(yè)務(wù)功能,筆者也按照自己的需求寫(xiě)了一套,同樣的開(kāi)發(fā)者可根據(jù)自身需要自行添加或修改。
VideoPlayerGestures 主要是處理手勢(shì)的,比如快進(jìn)、快退等跳轉(zhuǎn)播放;左側(cè)上下滑動(dòng)調(diào)節(jié)亮度;右側(cè)上下滑動(dòng)調(diào)節(jié)音量;單擊是否開(kāi)啟沉浸式播放,所有widget的隱藏與顯示;雙擊播放、暫停等。
哦,還有 PercentageWidget 也放到這個(gè)文件下了,就是這玩意:
因?yàn)轱@示的百分比與手勢(shì)相關(guān),隨著手勢(shì)移動(dòng)而更新。開(kāi)發(fā)者可自行處理。
筆者處出于簡(jiǎn)單考慮,就按照整個(gè)UI的位置命名了。瞅一眼就知道是啥玩意。
同樣的開(kāi)發(fā)者可根據(jù)自身需要自行添加或修改。
就是這玩意:
同樣的開(kāi)發(fā)者可根據(jù)自身需要自行添加或修改。話說(shuō)這個(gè)鎖的 Icon 的open和close是真的難分辨!
就是這玩意:
同樣的開(kāi)發(fā)者可根據(jù)自身需要自行添加或修改。
這玩意是自定義的,別問(wèn),問(wèn)就是跟產(chǎn)品干一架落了下風(fēng)
主要就是自定義這玩意:
同樣的開(kāi)發(fā)者可根據(jù)自身需要自定義。
注:這里沒(méi)有添加緩沖的進(jìn)度,開(kāi)發(fā)可查看 video_player 中的源碼 VideoProgressIndicator ,按業(yè)務(wù)自行定義。
這玩意就是整合以上的widget,再考慮下全屏的安全區(qū)域,沒(méi)啥東西。開(kāi)發(fā)者可自行處理!
具體的實(shí)現(xiàn)監(jiān)聽(tīng)器的思路, 看這里 。
自此一個(gè)漂亮的Flutter視頻播放器就已經(jīng)結(jié)束了。如果您覺(jué)得對(duì)您有些許幫助的話,歡迎 Star !
只能說(shuō) Flutter 確實(shí)很強(qiáng)大
ffmpeg 插件,文檔沒(méi)給出如何給視頻添加水印, 但是給出了執(zhí)行命令的方法演示, 這就足夠了。
添加一個(gè)水印:
String command = "-i " + inputVideoPath +
" -i "+waterMarkPath+" -filter_complex overlay "+
outVideoPath+"";
添加多個(gè)水印命令:
String command = "-i " + inputVideoPath +
" -i "+waterMarkPath2+" -i "+waterMarkPath+
" -filter_complex overlay=10:10,overlay=5:5 "+
outVideoPath+"";
將視頻轉(zhuǎn)換成小尺寸視頻:
String command = "-i " + inputVideoPath +" -b:v 10000k -s 216x384 "+ outVideoPath+"";
如果碰到 App crash with error message: couldn't find "libmobileffmpeg_abidetect.so"
執(zhí)行
flutter clean
flutter doctor -v
前提:Flutter 項(xiàng)目中引入使用多個(gè)插件,內(nèi)含有swift與靜態(tài)庫(kù)時(shí)出現(xiàn)的一系列問(wèn)題
問(wèn)題一、swift插件缺少設(shè)置swift的版本號(hào)
解決方案:在Xcode中打開(kāi)項(xiàng)目Targets—builds settings —user-defined
在user-defined內(nèi)添加一行:SWIFT_VERSION(版本號(hào)視當(dāng)前版本號(hào)為準(zhǔn))
問(wèn)題二、靜態(tài)庫(kù)
看到網(wǎng)上好多的解決方法是刪除掉或者添加上Podfile中的use_frameworks!,實(shí)測(cè)與此無(wú)關(guān),錯(cuò)誤信息忘記截圖啦????,大體就是pod install 時(shí)出現(xiàn)無(wú)法install之類的信息
正解方法是找到相關(guān)錯(cuò)誤插件內(nèi)的podspec文件,添加s.static_framework = true
新聞名稱:flutter音頻插件,flutter 播放器插件
本文地址:http://chinadenli.net/article27/dsepgjj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、商城網(wǎng)站、App開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站、全網(wǎng)營(yíng)銷推廣、軟件開(kāi)發(fā)
聲明:本網(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)