Flutter支持穩(wěn)定的桌面設(shè)備開發(fā)已經(jīng)一段時(shí)間了,不得不說,F(xiàn)lutter多平臺(tái)支持的特性真的很香。我本人并沒有任何桌面開發(fā)的經(jīng)驗(yàn),但仍然使用Flutter開發(fā)出了一個(gè)桌面版小程序,功能很簡單,就是對輸入的json做格式化處理和轉(zhuǎn)模型。

創(chuàng)新互聯(lián)公司不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨(dú)特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的網(wǎng)站制作、做網(wǎng)站質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時(shí),也能得到同行業(yè)的專業(yè)認(rèn)可,能夠?yàn)樾袠I(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級(jí),滿足企業(yè)一站式營銷型網(wǎng)站建設(shè)需求,讓再小的成都品牌網(wǎng)站建設(shè)也能產(chǎn)生價(jià)值!
話不多說,先來看看實(shí)際效果。 項(xiàng)目源碼地址
開發(fā)環(huán)境如下:
Flutter : 2.8.1
Dart : 2.15.1
IDE : VSCode
JSON作為我們?nèi)粘i_發(fā)工作中經(jīng)常要打交道的一種數(shù)據(jù)格式,它共有6種數(shù)據(jù)類型: null , num , string , object , array , bool 。我們勢必對它又愛又恨。愛他因?yàn)樗鳛閿?shù)據(jù)處理的一種格式確實(shí)非常方便簡潔。但是在我們做Flutter開發(fā)中,又需要接觸到j(luò)son解析時(shí),就會(huì)感覺非常棘手,因?yàn)閒lutter沒有反射,導(dǎo)致json轉(zhuǎn)模型這塊需要手寫那繁雜的映射關(guān)系。就像下面這樣子。
數(shù)據(jù)量少還能接受,一旦量大,那么光手寫這個(gè)解析方法都能讓你懷疑人生。更何況手寫還有出錯(cuò)的可能。好在官方有個(gè)工具**json_serializable**可以自動(dòng)生成這塊轉(zhuǎn)換代碼,也解決了flutter界json轉(zhuǎn)模型的空缺。當(dāng)然,業(yè)界也有專門解析json的網(wǎng)站,可以自動(dòng)生成dart代碼,使用者在生成后復(fù)制進(jìn)項(xiàng)目中即可,也是非常方便的。
本項(xiàng)目以json解析為切入點(diǎn),和大家一起來看下flutter是如何開發(fā)桌面應(yīng)用的。
要讓我們的flutter項(xiàng)目支持桌面設(shè)備。我們首先需要修改下flutter的設(shè)置。如下,讓我們的項(xiàng)目支持 windows 和 macos 系統(tǒng)。
接下來使用 flutter create 命令創(chuàng)建我們的模版工程。
創(chuàng)建完項(xiàng)目后,我們就可以 run 起來了。
先來看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。
我們在新建一個(gè)桌面應(yīng)用時(shí),默認(rèn)的模版又一個(gè)Appbar,此時(shí)應(yīng)用可以用鼠標(biāo)拖拽移動(dòng),放大縮小,還可以縮到很小。但是,我們一旦去掉這個(gè)導(dǎo)航欄,那么窗口就不能用鼠標(biāo)拖動(dòng)了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會(huì)導(dǎo)致頁面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過 bitsdojo_window ,我們可以實(shí)現(xiàn)窗口的定制化,拖動(dòng),最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關(guān)閉的按鈕等。
通過 InkWell 組件,可以捕捉到手勢、鼠標(biāo)、觸控筆的移動(dòng)和停留位置
這個(gè)功能是鼠標(biāo)移動(dòng)后的UI交互界面。要在窗口上顯示一個(gè)提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結(jié)點(diǎn)不是 Material 風(fēng)格的組件,因此會(huì)出現(xiàn)黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創(chuàng)建的 OverlayEntry 一個(gè)位置,否則它將全屏顯示。
讀取說表拖拽的文件一開始想嘗試使用 InkWell 組件,但是這個(gè)組件無法識(shí)別拖拽中的鼠標(biāo),并且也無法從中拿到文件信息。因此放棄。后來從文章《Flutter-2天寫個(gè)桌面端APP》中發(fā)現(xiàn)一個(gè)可讀取拖拽文件的組件 desktop_drop ,能滿足要求。
使用開源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。
Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫 buildTextSpan 方法。
在做導(dǎo)出功能時(shí)遇到下列報(bào)錯(cuò),保存提示為沒有權(quán)限訪問對應(yīng)目錄下的文件。
通過Apple的開發(fā)文檔找到有關(guān)權(quán)限問題的說明。其中有個(gè)授權(quán)私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對用戶的下載文件夾的讀/寫訪問權(quán)限 。那么,使用Xcode打開Flutter項(xiàng)目中的mac應(yīng)用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設(shè)置為YES,保存后重啟Flutter項(xiàng)目。發(fā)現(xiàn)已經(jīng)可以向下載目錄中讀寫文件了。
當(dāng)然,這是正常操作。還有個(gè)騷操作就是關(guān)閉系統(tǒng)的沙盒機(jī)制。將 entitlements 文件的 App Sandbox 設(shè)置為NO。這樣我們就可以訪問任意路徑了。當(dāng)然關(guān)閉應(yīng)用的沙盒也就相當(dāng)于關(guān)閉了應(yīng)用的防護(hù)機(jī)制,因此這個(gè)選項(xiàng)慎用。
原文地址:
沒有。
咸魚flutter沒有換成h5,咸魚不僅有flutter的開發(fā)應(yīng)用,還包括h5的開發(fā)應(yīng)用,flutterflutter更偏向客戶端的研發(fā)體系,h5性能穩(wěn)定,因?yàn)槎哂胁煌膬?yōu)勢,所以咸魚flutter沒有換成h5,而是兩者共用。
咸魚flutter是一個(gè)全新的移動(dòng)UI框架,它允許使用同一個(gè)代碼庫構(gòu)建高性能的Android和iOS應(yīng)用,在此基礎(chǔ)之上,以h5為數(shù)據(jù)分析的系統(tǒng),進(jìn)行大數(shù)據(jù)分析,從而二者共同促進(jìn)咸魚的使用率。
在項(xiàng)目中找到 AndroidManifest.xml 文件,其中 android:label="demo" 就是應(yīng)用程序名稱,修改引號(hào)中的內(nèi)容即可
在項(xiàng)目中找到 mipmap-mdpi mipmap-hdpi mipmap-xhdpi mipmap-xxhdpi mipmap-xxxhdpi 文件夾,替換這些文件夾中的 ic_launcher.png 文件即可
注意:圖標(biāo)有多種尺寸的大小,是為了適配不同分辨率的手機(jī)而設(shè)計(jì)的
在項(xiàng)目中找到 Info.plist 文件,其中 CFBundleDisplayName 和 CFBundleName 下面的就是應(yīng)用程序名稱,修改內(nèi)容即可
找到項(xiàng)目中的 AppIcon.appiconset 文件夾,其中 Contents.json 是配置文件,其它的圖片文件就是圖標(biāo),替換這些圖片文件即可
注意:圖標(biāo)有多種尺寸的大小,是為了適配不同分辨率的手機(jī)而設(shè)計(jì)的
插件地址:
在項(xiàng)目中找到 pubspec.yaml 文件,添加內(nèi)容如下
插件地址:
在項(xiàng)目中找到 pubspec.yaml 文件,添加內(nèi)容如下
注意:準(zhǔn)備一張 1024x1024 的 png 圖片,取名為 icon.png 并把它放在 assets/icon 目錄中
找到 ~/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_launcher_icons-0.9.2/lib/android.dart 文件修改內(nèi)容如下
注意:如果使用了鏡像地址就找到 ~flutter/.pub-cache/hosted/pub.flutter-io.cn/flutter_launcher_icons-0.9.2/lib/android.dart 文件來修改以上內(nèi)容
點(diǎn)擊 “協(xié)議、稅務(wù)和銀行業(yè)務(wù)”
內(nèi)購用的是付費(fèi)應(yīng)用程序,先簽署《付費(fèi)應(yīng)用程序協(xié)議》,同意后狀態(tài)變更為“用戶信息待處理”,等待審核。
狀態(tài)更改完畢后,點(diǎn)擊“開始設(shè)置稅務(wù)、銀行業(yè)務(wù)和聯(lián)系信息”。
(1)添加銀行賬戶,按照要求填寫相關(guān)內(nèi)容即可。
(2)選擇報(bào)稅表,并填寫。所有與 Apple 有商業(yè)合作者必選都是美國,若有其他需求,可以多選。
繼續(xù)填寫,首先認(rèn)證公司基本信息,選擇所有人類型,確認(rèn)無誤后認(rèn)證條款處打?qū)?/p>
Part I 部分,繼續(xù)核對公司相關(guān)信息,選填內(nèi)容可不填。
Part III 部分,簽署稅務(wù)條約,設(shè)置利益限制條款的種類,選填內(nèi)容可不填。此部分如果需要可勾選上下圖勾選框,不需要可不勾選,我們這個(gè)項(xiàng)目沒有用到part III 部分,所以沒有勾選。
Part XXX 部分,確認(rèn)之前填寫的信息,勾選完畢后,提交
(3)填寫聯(lián)系信息,共5個(gè)。高級(jí)管理、財(cái)務(wù)、技術(shù)、法務(wù)、營銷。只需要提供5個(gè)人的基本信息即可。
只可使用一次的產(chǎn)品,使用之后即失效,必須再次購買。
示例: 釣魚 App 中的魚食。
只需購買一次,不會(huì)過期或隨著使用而減少的產(chǎn)品。
示例: 游戲 App 的賽道。
允許用戶在固定時(shí)間段內(nèi)購買動(dòng)態(tài)內(nèi)容的產(chǎn)品。除非用戶選擇取消,否則此類訂閱會(huì)自動(dòng)續(xù)期。
示例: 每月訂閱提供流媒體服務(wù)的 App。
允許用戶購買有時(shí)限性服務(wù)的產(chǎn)品。此 App 內(nèi)購買項(xiàng)目的內(nèi)容可以是靜態(tài)的。此類訂閱不會(huì)自動(dòng)續(xù)期。
示例: 為期一年的已歸檔文章目錄訂閱。
App 內(nèi)購買項(xiàng)目的截屏,即所售項(xiàng)目的示意圖。例如,如果 App 內(nèi)購買項(xiàng)目是一本圖書,您可以提交圖書的截屏。您也可以提交購買頁的截屏。該截屏僅用于 Apple 審核,不會(huì)在 App Store 中顯示。
截屏要求如下:
iOS 至少需要 640 x 920 像素
Apple tvOS 需要 1920 x 1080 像素
macOS 需要 1280 x 800 像素
App 審核圖像上傳后,可以替換,但無法移除。當(dāng)您的 App 內(nèi)購買項(xiàng)目處于審核中時(shí),您無法更新截屏。
沙箱賬號(hào)是不能直接在App Store進(jìn)行登錄的,只能在點(diǎn)擊了購買商品之后,在彈出的登錄框進(jìn)行登錄 。
驗(yàn)證是否已登錄沙箱測試賬號(hào):
設(shè)置--iTunes Store與App Store,頁面拉到最底部,會(huì)看到沙箱賬戶項(xiàng)會(huì)列出你已登錄的沙箱測試賬號(hào)!
操作方法一:打開App Store應(yīng)用首頁滑到最下方--選中AppleID--注銷
操作方法二:設(shè)置--iTunes Store與App Store--選中AppleID--注銷
checks if the client can make payments(檢測App是否能支付)
getAvailablePurchases
Get all non-consumed purchases 獲取未消費(fèi)的商品
打印信息查詢;
原因:
沒有先執(zhí)行g(shù)etProducts,直接執(zhí)行requestPurchase方法,要先拉取商品列表,再執(zhí)行購買操作.
問題描述;
1.漏單必須要處理,玩家花RMB購買的東西卻丟失了,是絕對不能容忍的。所謂的漏單就是玩家已經(jīng)正常付費(fèi),卻沒有拿到該拿的道具。
解決:只要購買成功,便將購買記錄(receipt等賬單信息)保存下來,然后將賬單信息傳送給我們游戲服務(wù)器,游戲服務(wù)器獲得賬單后,和蘋果服務(wù)器驗(yàn)證,賬單有效的話,回饋給游戲服務(wù)器處理,游戲服務(wù)器處理后,返回給游戲客戶端處理,處理完畢,將本地保存的購買記錄刪除。
官方文檔:向蘋果校驗(yàn)支付憑證
21000 App Store無法讀取你提供的JSON數(shù)據(jù)
21002 收據(jù)數(shù)據(jù)不符合格式
21003 收據(jù)無法被驗(yàn)證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據(jù)服務(wù)器當(dāng)前不可用
21006 收據(jù)是有效的,但訂閱服務(wù)已經(jīng)過期。當(dāng)收到這個(gè)信息時(shí),解碼后的收據(jù)信息也包含在返回內(nèi)容中
21007 收據(jù)信息是測試用(sandbox),但卻被發(fā)送到產(chǎn)品環(huán)境中驗(yàn)證 【請求sandbox校驗(yàn)支付憑證】
21008 收據(jù)信息是產(chǎn)品環(huán)境中使用,但卻被發(fā)送到測試環(huán)境中驗(yàn)證
消耗類型: 例如:金幣、道具等。
非續(xù)訂訂閱: non-renewable subscription 例如:VIP
您的首個(gè) App 內(nèi)購買項(xiàng)目必須以新的 App 版本提交。請創(chuàng)建您的 App 內(nèi)購買項(xiàng)目,然后前往 App 的“App Store”頁,從“App 內(nèi)購買項(xiàng)目”中進(jìn)行選擇,點(diǎn)按“提交”。 了解更多
在上傳二進(jìn)制文件并提交首個(gè) App 內(nèi)購買項(xiàng)目以供審核后,您可以使用下表提交其他 App 內(nèi)購買項(xiàng)目。
唐巧-iOS應(yīng)用內(nèi)付費(fèi)(IAP)開發(fā)步驟列表
未完~待續(xù)
當(dāng)使用內(nèi)購購買過商品之后沒有把這個(gè)交易關(guān)閉,所以再次去購買商品后就會(huì)調(diào)用以前已經(jīng)購買成功的交易去購買因?yàn)橐呀?jīng)購買過,才會(huì)有這個(gè)提示
原因:添加內(nèi)購項(xiàng)目時(shí),信息填寫不完整,app審核圖像未上傳
處理方法:上傳app審核圖片( 合適的尺寸 ),點(diǎn)擊提交,狀態(tài)改為正在準(zhǔn)備審核中。
這個(gè)是內(nèi)購選擇類型不匹配原因?qū)е隆?/p>
購買成功之后,Apple會(huì)返回以下四個(gè)數(shù)據(jù)給應(yīng)用
Reference
Review the updated Paid Applications Schedule.
游客身份解決方案:即不登錄也要能購買
1)服務(wù)器端做一個(gè)蘋果審核機(jī)制,審核期間游客身份可以進(jìn)行一切行為,一旦審核通過,修改服務(wù)端即可達(dá)到強(qiáng)制用戶登錄進(jìn)行內(nèi)購買的目的(這個(gè)有點(diǎn)。。。)
2)游客可以進(jìn)行內(nèi)購買,購買時(shí)以設(shè)備UUID為準(zhǔn),生成一個(gè)游客賬號(hào),將購買信息保存在服務(wù)器和本地,當(dāng)用戶登錄正式賬戶后判斷此設(shè)備是否進(jìn)行過內(nèi)購,有的話提示用戶將游客身份購買的權(quán)益與現(xiàn)有賬號(hào)綁定,如果綁定,游客權(quán)益則遷移到正式賬戶,如果不遷移,則游客身份和正是賬戶是兩個(gè)獨(dú)立賬戶,正式賬戶不享有游客身份的權(quán)益(我用的這個(gè))
內(nèi)購游客模式解決方案
iOS內(nèi)購規(guī)則
目前我們是flutter項(xiàng)目,有個(gè)需求是需要在app內(nèi)引導(dǎo)用戶去appStore或是安卓的應(yīng)用商店去評(píng)價(jià),該需求我選用了兩個(gè)插件 in_app_review 和 launch_review , 然而仔做的過程中發(fā)現(xiàn)一個(gè)問題,當(dāng)彈出系統(tǒng)的跳轉(zhuǎn)應(yīng)用商店的彈框時(shí),iOS是單一彈框,Android是彈出一個(gè)選擇打開商店的彈窗,可選擇打開一次或是始終選擇某一個(gè)商店打開,此時(shí)鎖屏,然后再解鎖,發(fā)現(xiàn)iOS沒啥問題,安卓系統(tǒng)彈框后的flutter頁面黑屏了
看到這個(gè)現(xiàn)象,目測是由于安卓的生命周期和flutter的生命周期沒有同步,以下是驗(yàn)證過程
安卓的MainActivity添加生命周期方法
flutter 添加生命周期方法
還是剛才的場景 鎖屏 安卓和flutter的后臺(tái)方法都調(diào)用,解鎖回到前臺(tái) 只有安卓的前臺(tái)方法走 MainActivity會(huì)restart,flutter的resume方法,沒有調(diào)用,驗(yàn)證了開始的猜想,是由于flutter沒有檢測到前臺(tái)操作或是這種情況flutter不認(rèn)為自己在前臺(tái),導(dǎo)致flutter沒有執(zhí)行頁面的重新繪制導(dǎo)致黑屏
關(guān)于flutter的生命周期,查閱資料發(fā)現(xiàn) 我們可以手動(dòng)刷新flutter頁面的狀態(tài),即使用
我們只需要在MainActivity restart的時(shí)候調(diào)用上述 方法 告知flutter重繪,該問題就解決了
關(guān)于原生加載flutter頁面 生命周期相關(guān) 看這里 能有一些啟發(fā)
當(dāng)前名稱:flutter應(yīng)用商店,flutter下載功能
文章轉(zhuǎn)載:http://chinadenli.net/article10/dsidcdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、定制網(wǎng)站、App開發(fā)、搜索引擎優(yōu)化、靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)