Flutter開發桌面應用,Google準備了三年!蓄勢待發!

已經三年了

Desktop Embedding for Flutter項目,從提交“Initial commit”(2018年2月15日)到現在,已經三年了。

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

image

終于可以用于生產了

目前該文檔已經改成如下:


image

有兩個要點:

  1. 從一個獨立的項目到嵌入到flutter,可以說由干兒子變成了親兒子了
  2. 去掉了不適用于生產環境的提示:
- The code and examples here, and the desktop Flutter libraries they use, are in early stages, and not intended for production use.
- 這里的代碼和示例,以及它們使用的桌面Flutter庫處于早期階段,不打算用于生產。

目前新的文檔在:Desktop-shells

從文檔的歷史記錄我們可以看到這個發展過程:

2019年12月5日:支持了macos

2020年7月8日:linux平臺就已經進入了alpha階段

2020年9月24日:windows平臺進入alpha階段

截止2020年9月文檔中windows平臺的狀態由“early technical preview”改成了“alpha”,至此三大平臺的狀態都進入了alpha。

用Flutter開發桌面應用,可以說是蓄勢待發了。
2021年2月25日文檔有進行了一次變更但僅僅是文本格式變更,難道是在做發布前的準備?

今天有時間,忍不住體驗了一下macos端app的開發。分享一下過程:

Flutter桌面應用開發初體驗

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

切換channel

輸入“flutter channel dev”結果如下:

$ 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

上一步的提示,按照提示我們執行“flutter upgrade”進行更新

$ 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)

驗證

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

$ 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

以往我們創建的項目都是不帶macos的平臺的。

我們可以通過下面這條命令,向已有項目添加platform:
“flutter create --platforms=macos .”
執行完這條命令我們可以在項目根目錄下發現一個macos目錄。

接下來就是激動人心的flutter run 時刻了。
然而和以往不同的是,現在需要我們選擇設備了。
即便你沒有連接手機,你也已經有兩個設備了:

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

這樣我們就需要傳遞設備id了
現在我們通過這條命令就可以啟動我們的macos桌面app了。

運行桌面app

flutter run -d macos
image

桌面應用的一個特點是鼠標移動到一個控件上的時候,可以給用戶一個提示。

默認的例子中floatingActionButton的tooltip就是用來設置提示文案的。

當我們將鼠標移動到右下角的懸浮按鈕上的時候,就會見到這個提示了。

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.
    );
  }
}

如果我們還想在手機上開發應用需要指定設備

列出設備:

如果我們同時連接了安卓和ios手機結果會是這樣

$ 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

按照設備運行

此時如果我們想用安卓手機調試則需要輸入:

flutter run -d c7e616ee

如果想要用ios手機調試則輸入:

flutter run -d 1cbcdf88d261301317e2d83b07fcfbb48501e47d

折騰完hello word并不過癮,又將以前的項目拿出來實驗。

解決聯網問題

然而意外發生了。


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上無法顯示圖片的問題,
然而這次并不管用。

隨后經過探索發現macos還有其獨特的權限控制。
參考:
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.

說人話就是:

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

<?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>

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

再次運行桌面應用:

image

有點太丑了,隨后適配了一下:

image

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






?? ?????? ??
??
眼巴巴盼著你點贊
??
?? 轉發請保持文章完整 ??
?? 轉發請注明出處:http://www.lxweimin.com/p/ecc8fad9117e ??
?? 本文作者正眼巴巴盼著你點贊 ??
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373