Flutter開發(fā)桌面應(yīng)用,Google準(zhǔn)備了三年凰棉!蓄勢(shì)待發(fā)损拢!

已經(jīng)三年了

Desktop Embedding for Flutter項(xiàng)目,從提交“Initial commit”(2018年2月15日)到現(xiàn)在渊啰,已經(jīng)三年了探橱。

一年前的官方文檔仍然警告用戶,“不打算用于生產(chǎn)”

image

終于可以用于生產(chǎn)了

目前該文檔已經(jīng)改成如下:


image

有兩個(gè)要點(diǎn):

  1. 從一個(gè)獨(dú)立的項(xiàng)目到嵌入到flutter绘证,可以說(shuō)由干兒子變成了親兒子了
  2. 去掉了不適用于生產(chǎn)環(huán)境的提示:
- The code and examples here, and the desktop Flutter libraries they use, are in early stages, and not intended for production use.
- 這里的代碼和示例,以及它們使用的桌面Flutter庫(kù)處于早期階段哗讥,不打算用于生產(chǎn)嚷那。

目前新的文檔在:Desktop-shells

從文檔的歷史記錄我們可以看到這個(gè)發(fā)展過(guò)程:

2019年12月5日:支持了macos

2020年7月8日:linux平臺(tái)就已經(jīng)進(jìn)入了alpha階段

2020年9月24日:windows平臺(tái)進(jìn)入alpha階段

截止2020年9月文檔中windows平臺(tái)的狀態(tài)由“early technical preview”改成了“alpha”,至此三大平臺(tái)的狀態(tài)都進(jìn)入了alpha杆煞。

用Flutter開發(fā)桌面應(yīng)用魏宽,可以說(shuō)是蓄勢(shì)待發(fā)了。
2021年2月25日文檔有進(jìn)行了一次變更但僅僅是文本格式變更决乎,難道是在做發(fā)布前的準(zhǔn)備队询?

今天有時(shí)間,忍不住體驗(yàn)了一下macos端app的開發(fā)构诚。分享一下過(guò)程:

Flutter桌面應(yīng)用開發(fā)初體驗(yàn)

由于目前處于目前尚處于alpha階段蚌斩,因此我們必須將Flutter的channel切換到dev才行。

切換channel

輸入“flutter channel dev”結(jié)果如下:

$ flutter channel dev
Switching to flutter channel 'dev'...

....

flutter upgrade
git: Switched to a new branch 'dev'
git: Branch 'dev' set up to track remote branch 'dev' from 'origin'.
Successfully switched to flutter channel 'dev'.
To ensure that you're on the latest build from this channel, run 'flutter
upgrade'

更新flutter

上一步的提示范嘱,按照提示我們執(zhí)行“flutter upgrade”進(jìn)行更新

$ flutter upgrade
Downloading Dart SDK from Flutter engine 6993cb229b99e6771c6c6c2b884ae006d8160a0f...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  199M  100  199M    0     0  10.5M      0  0:00:18  0:00:18 --:--:-- 10.7M
Building flutter tool...
Flutter is already up to date on channel dev
Flutter 1.27.0-8.0.pre ? channel dev ? https://github.com/flutter/flutter.git
Framework ? revision b7d4806243 (7 days ago) ? 2021-02-19 09:22:45 -0800
Engine ? revision 6993cb229b
Tools ? Dart 2.13.0 (build 2.13.0-30.0.dev)

驗(yàn)證

看一下我們的桌面設(shè)備是否能找到了

$ flutter devices
Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure
you trust this source!
Downloading Material fonts...                                      457ms
Downloading Gradle Wrapper...                                       33ms
Downloading package sky_engine...                                  158ms
Downloading flutter_patched_sdk tools...                         1,111ms
Downloading flutter_patched_sdk_product tools...                 1,094ms
Downloading darwin-x64 tools...                                     3.3s
Downloading darwin-x64/font-subset tools...                        543ms
2 connected devices:

macOS (desktop) ? macos  ? darwin-x64     ? Mac OS X 10.15.7 19H524 darwin-x64
Chrome (web)    ? chrome ? web-javascript ? Google Chrome 88.0.4324.192

添加platform

以往我們創(chuàng)建的項(xiàng)目都是不帶macos的平臺(tái)的送膳。

我們可以通過(guò)下面這條命令,向已有項(xiàng)目添加platform:
“flutter create --platforms=macos .”
執(zhí)行完這條命令我們可以在項(xiàng)目根目錄下發(fā)現(xiàn)一個(gè)macos目錄丑蛤。

接下來(lái)就是激動(dòng)人心的flutter run 時(shí)刻了叠聋。
然而和以往不同的是,現(xiàn)在需要我們選擇設(shè)備了受裹。
即便你沒(méi)有連接手機(jī)碌补,你也已經(jīng)有兩個(gè)設(shè)備了:

macOS (desktop)        ? macos                                    ? darwin-x64     ? Mac OS X 10.15.7 19H524 darwin-x64
Chrome (web)           ? chrome                                   ? web-javascript ? Google Chrome 88.0.4324.192

這樣我們就需要傳遞設(shè)備id了
現(xiàn)在我們通過(guò)這條命令就可以啟動(dòng)我們的macos桌面app了。

運(yùn)行桌面app

flutter run -d macos
image

桌面應(yīng)用的一個(gè)特點(diǎn)是鼠標(biāo)移動(dòng)到一個(gè)控件上的時(shí)候棉饶,可以給用戶一個(gè)提示厦章。

默認(rèn)的例子中floatingActionButton的tooltip就是用來(lái)設(shè)置提示文案的。

當(dāng)我們將鼠標(biāo)移動(dòng)到右下角的懸浮按鈕上的時(shí)候砰盐,就會(huì)見到這個(gè)提示了闷袒。

import 'package:flutter/material.dart';

// ...
class _MyHomePageState extends State<MyHomePage> {
    
  // ...

  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      // ...
      body: Center(
        // ...
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

如果我們還想在手機(jī)上開發(fā)應(yīng)用需要指定設(shè)備

列出設(shè)備:

如果我們同時(shí)連接了安卓和ios手機(jī)結(jié)果會(huì)是這樣

$ flutter devices
4 connected devices:

Redmi K30 Pro (mobile) ? c7e616ee                                 ? android-arm64  ? Android 10 (API 29)
xxx的iPhone (mobile)    ? 1cbcdf88d261301317e2d83b07fcfbb48501e47d ? ios            ? iOS 13.6.1
macOS (desktop)        ? macos                                    ? darwin-x64     ? Mac OS X 10.15.7 19H524 darwin-x64
Chrome (web)           ? chrome                                   ? web-javascript ? Google Chrome 88.0.4324.192

按照設(shè)備運(yùn)行

此時(shí)如果我們想用安卓手機(jī)調(diào)試則需要輸入:

flutter run -d c7e616ee

如果想要用ios手機(jī)調(diào)試則輸入:

flutter run -d 1cbcdf88d261301317e2d83b07fcfbb48501e47d

折騰完hello word并不過(guò)癮,又將以前的項(xiàng)目拿出來(lái)實(shí)驗(yàn)岩梳。

解決聯(lián)網(wǎng)問(wèn)題

然而意外發(fā)生了囊骤。


image
SocketException: Connection failed (OS Error: Operation not permitted, errno = 1)

開始我天真的以為這是蘋果禁用http的后果晃择,
然后添加了NSAllowsArbitraryLoads:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    <!--- ... --->
</dict>
</plist>

上次就是這樣成功的解決了iPhone上無(wú)法顯示圖片的問(wèn)題,
然而這次并不管用也物。

隨后經(jīng)過(guò)探索發(fā)現(xiàn)macos還有其獨(dú)特的權(quán)限控制宫屠。
參考:
https://github.com/flutter/flutter/issues/47606
https://flutter.dev/desktop#entitlements-and-the-app-sandbox


Important: The com.apple.security.network.server entitlement, which allows incoming network connections, is enabled by default only for debug and profile builds to enable communications between Flutter tools and a running app. If you need to allow incoming network requests in your application, you must add the com.apple.security.network.server entitlement to Runner-Release.entitlements as well, otherwise your app will work correctly for debug or profile testing, but will fail with release builds.

說(shuō)人話就是:

需要在macos/Runner/DebugProfile.entitlements文件中添加com.apple.security.network.client權(quán)限。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.network.server</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
</dict>
</plist>

如果你想發(fā)布還需要在
macos/Runner/Release.entitlements添加“com.apple.security.network.server”和“com.apple.security.network.client"

再次運(yùn)行桌面應(yīng)用:

image

有點(diǎn)太丑了滑蚯,隨后適配了一下:

image

感興趣的同學(xué)可以看一下源碼:
https://github.com/ovotop/flutterame






?? ?????? ??
??
眼巴巴盼著你點(diǎn)贊
??
?? 轉(zhuǎn)發(fā)請(qǐng)保持文章完整 ??
?? 轉(zhuǎn)發(fā)請(qǐng)注明出處:http://www.reibang.com/p/ecc8fad9117e ??
?? 本文作者正眼巴巴盼著你點(diǎn)贊 ??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浪蹂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子告材,更是在濱河造成了極大的恐慌坤次,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥赋,死亡現(xiàn)場(chǎng)離奇詭異缰猴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疤剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門滑绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隘膘,你說(shuō)我怎么就攤上這事疑故。” “怎么了弯菊?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵纵势,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我误续,道長(zhǎng)吨悍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任蹋嵌,我火速辦了婚禮育瓜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栽烂。我一直安慰自己躏仇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布腺办。 她就那樣靜靜地躺著焰手,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怀喉。 梳的紋絲不亂的頭發(fā)上书妻,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音躬拢,去河邊找鬼躲履。 笑死见间,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的工猜。 我是一名探鬼主播米诉,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篷帅!你這毒婦竟也來(lái)了史侣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤魏身,失蹤者是張志新(化名)和其女友劉穎惊橱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠骑,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡李皇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宙枷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茧跋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轧拄,我是刑警寧澤汰具,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站粥烁,受9級(jí)特大地震影響贤笆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讨阻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一芥永、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钝吮,春花似錦埋涧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耳标,卻和暖如春醇坝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背次坡。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工呼猪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留画畅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓郑叠,卻偏偏與公主長(zhǎng)得像夜赵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乡革,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348