Flutter 1.22 正式發(fā)布

支持iOS 14和Android 11涂圆,新的i18n和l10n支持们镜,可用于生產(chǎn)的Google Maps和WebView插件,新的App Size工具等等润歉!

作者:Chris Sells

原文:https://medium.com/flutter/announcing-flutter-1-22-44f146009e5f

我們很高興推出最新版本的Flutter模狭,它廣泛支持iOS 14和Android11。Flutter 1.22在以前版本的基礎(chǔ)上構(gòu)建踩衩,使開發(fā)人員能夠從一個(gè)代碼庫為多個(gè)平臺(tái)構(gòu)建快速嚼鹉,美觀的用戶體驗(yàn)。我們的季度穩(wěn)定版本包含最新功能驱富,性能改進(jìn)和錯(cuò)誤修復(fù)锚赤,適合廣泛的生產(chǎn)使用。

由于這是新的移動(dòng)操作系統(tǒng)版本的發(fā)布季節(jié)褐鸥,因此此發(fā)行版?zhèn)戎赜诖_保Android 11和iOS 14與Flutter兼容线脚。這兩個(gè)操作系統(tǒng)的更新都包括大量的幕后工作,以符合最新的SDK并確保所有內(nèi)容都通過我們廣泛的測(cè)試套件叫榕。對(duì)于iOS 14浑侥,此版本包括對(duì)新Xcode 12,新圖標(biāo)的支持以及對(duì)新iOS 14 App Clips功能的預(yù)覽支持晰绎。對(duì)于Android 11寓落,此更新支持新類型的顯示切口以及在調(diào)出軟鍵盤時(shí)更流暢的動(dòng)畫。

該版本發(fā)布于我們的1.20發(fā)布兩個(gè)月之后荞下,因此比大多數(shù)版本都短伶选。即使在這么短的時(shí)間內(nèi)史飞,我們也關(guān)閉了3,024期,合并了197個(gè)貢獻(xiàn)者的1,944個(gè)PR考蕾。在這些貢獻(xiàn)者中祸憋,有114位(58%)來自整個(gè)社區(qū),他們貢獻(xiàn)了271個(gè)PR肖卧。最大的單一貢獻(xiàn)者是 a14n蚯窥,他再次以20個(gè)PR成為我們的杰出貢獻(xiàn)者名單,其中大多數(shù)是作為支持Flutter中的零安全性工作的一部分而完成的(更多內(nèi)容即將推出)塞帐。

除了對(duì)新的移動(dòng)操作系統(tǒng)版本的支持外拦赠,還有很多其他要分享的新聞,包括預(yù)覽Android最重要的功能之一:狀態(tài)恢復(fù)葵姥,新的“Material 風(fēng)格按鈕“荷鼠,新的國際化和本地化支持(與熱重載一起使用),一個(gè)新的Navigator榔幸,一個(gè)穩(wěn)定的Platform Views版本(Google Maps和WebView插件的基礎(chǔ))以及一個(gè)開關(guān)允乐,您可以在其中添加代碼以改善在具有高頻率顯示的設(shè)備上的滾動(dòng)。我們還提供了一個(gè)用于剖析應(yīng)用程序大小并確保您要構(gòu)建的插件僅支持您要支持的平臺(tái)的新工具削咆。

iOS 14

每當(dāng)發(fā)布新版本的移動(dòng)操作系統(tǒng)時(shí)牍疏,我們都會(huì)對(duì)其進(jìn)行徹底測(cè)試,以查找影響Flutter及其工具的不兼容性或更改拨齐。

對(duì)于iOS 14鳞陨,我們對(duì)Flutter進(jìn)行了很多更改,以確保它可以按照開發(fā)人員的方式工作:

  • Xcode 12需要iOS 9.0或更高版本瞻惋,因此我們的默認(rèn)模板將其默認(rèn)值從8.0增加到9.0
  • iOS 14特定崩潰和字體渲染問題已在Flutter 1.22中修復(fù)
  • Flutter 1.20.4厦滤,修復(fù)了部署到真機(jī)設(shè)備的問題
  • 當(dāng)應(yīng)用程序訪問其剪貼板時(shí)顯示使用通知,導(dǎo)致在Flutter應(yīng)用程序中出現(xiàn)虛假通知歼狼,該問題已在Flutter 1.20.4中修復(fù)
  • iOS 14設(shè)備上會(huì)禁止運(yùn)行debug應(yīng)用程序掏导,但實(shí)際開發(fā)debug除外
  • 針對(duì)本地調(diào)試的Flutter應(yīng)用程序的有關(guān)網(wǎng)絡(luò)安全的新策略使iOS 14顯示一次性確認(rèn)對(duì)話框(僅在開發(fā)過程中,不適用于已發(fā)布的Flutter應(yīng)用程序)

如果您要通過Flutter應(yīng)用定位iOS 14羽峰,我們強(qiáng)烈建議您使用Flutter 1.22對(duì)其進(jìn)行重建趟咆,然后立即將其部署到App Store中,以確保您的iOS 14用戶獲得最佳體驗(yàn)限寞。

有關(guān)使用Flutter適配iOS 14的更多詳細(xì)信息忍啸,包括添加Flutter應(yīng)用到原生應(yīng)用,deep linking和通知注意事項(xiàng)履植,請(qǐng)參閱 flutter.dev上的iOS 14文檔计雌。

希望所有有關(guān)工具和SDK支持的工作都可以讓您專注于自己關(guān)心的編碼-利用iOS 14的新功能关贵。

其中一項(xiàng)功能是對(duì)iOS的新SF Symbols字體的更新支持森瘪,我們花一些時(shí)間更新了cupertino_icon程序包。將cupertino_icons依賴關(guān)系更新為新的1.0主要版本后,CupertinoIcons的現(xiàn)有用法將自動(dòng)映射到新樣式絮重。如果您將cupertino_icons 1.0與Flutter 1.22結(jié)合使用鼻吮,那么您還可以通過CupertinoIcons API訪問約900個(gè)新圖標(biāo)剩燥。

您可以在cupertino_icons預(yù)覽頁面上看到圖標(biāo)的完整列表澳骤,在 flutter.dev上可以看到遷移詳細(xì)信息頁面

您可以在iOS 14上嘗試使用Flutter的另一個(gè)功能是App Clips反番,它是iOS 14的一項(xiàng)新功能沙热,它支持10MB以下輕量級(jí)應(yīng)用程序的快速,無安裝應(yīng)用程序執(zhí)行罢缸。在Flutter 1.22版中篙贸,我們預(yù)覽了使用Flutter構(gòu)建的App Clip目標(biāo)。

有關(guān)如何使用Flutter構(gòu)建Clip的更多詳細(xì)信息枫疆,請(qǐng)查看flutter.dev上的文檔爵川。您也可以參考這個(gè)簡單的示例項(xiàng)目

Android 11

Flutter的這個(gè)版本也與本月Android 11的發(fā)布相吻合息楔。 Flutter框架和引擎已更新寝贡,以支持最新版本的Android中引入的兩個(gè)新功能。

首先值依,F(xiàn)lutter現(xiàn)在支持多種屏幕適配(比如瀑布屏)圃泡。

通過使用MediaQuery和SafeArea API,您可以確保將活動(dòng)的UI和交互式元素放置在設(shè)備顯示屏的無障礙區(qū)域中鳞滨。另外洞焙,您將要避免在瀑布邊緣區(qū)域使用手勢(shì)檢測(cè)器蟆淀,因?yàn)檫@可能會(huì)導(dǎo)致意外觸摸拯啦。

其次,動(dòng)畫在顯示軟件鍵盤時(shí)與Android 11同步熔任。

問題 #19279是一個(gè)長期存在的問題褒链,其中系統(tǒng)鍵盤的顯示/隱藏動(dòng)畫與Flutter的插圖不同步。這在Android 11中已修復(fù)疑苔。

關(guān)于Android嵌入API的一項(xiàng)說明甫匹。去年,隨著Flutter 1.12版的推出惦费,我們推出了一套適用于Android的新Flutter引擎和Flutter插件API兵迅。我們創(chuàng)建了這些v2 API,以更好地支持Android上的應(yīng)用程序添加用戶薪贫。一年后恍箭,超過80%的Android插件使用了新的Android API。從1.22開始瞧省,我們不再使用較舊的v1 API扯夭。

如果您仍在使用Android v1 API鳍贾,那么這對(duì)您意味著:

  • 新創(chuàng)建的插件將不再針對(duì)v1 API
  • Flutter工具的 -no-enable-android-embedding-v2配置標(biāo)記已刪除,現(xiàn)在是默認(rèn)行為
  • 仍在使用v1 API的舊版應(yīng)用程序在構(gòu)建過程中將顯示棄用警告交洗,該警告指向支持新的Android插件API文檔

同時(shí)骑科,如果您仍然有基于v1 Android API的Flutter應(yīng)用程序,它將繼續(xù)運(yùn)行构拳。但是咆爽,您可能會(huì)開始遇到僅針對(duì)v2 API且v1 Android API無法使用的新插件。有關(guān)更多詳細(xì)信息置森,請(qǐng)參見重大更改文檔伍掀。

擴(kuò)展的 Button 組件

現(xiàn)有的Flutter按鈕看上去不錯(cuò),但很難使用暇藏,尤其是在需要自定義主題時(shí)蜜笤。此外,“Material”規(guī)范已擴(kuò)展為包括具有新樣式的新按鈕盐碱。

為使Flutter保持與Material指南的最新水平把兔,我們很高興地宣布Flutter 1.22中的引入全新的按鈕。

該P(yáng)R并沒有嘗試就地開發(fā)現(xiàn)有的按鈕類及其主題瓮顽,而是引入了新的替換按鈕小部件和主題县好。除了使我們擺脫現(xiàn)有類的向后兼容性迷宮之外,新名稱還使Flutter與Material Design規(guī)范同步暖混,后者使用按鈕組件的新名稱缕贡。

新主題遵循Flutter最近在新Material窗口小部件中采用的“規(guī)范化”模式。如果您想玩演示拣播,DartPad上有一個(gè)很棒的演示晾咪。這并不是一個(gè)重大變化,因?yàn)镕latButton贮配,OutlineButton谍倦,RaisedButton,ButtonBar泪勒,ButtonBarTheme和ButtonTheme的語義不會(huì)改變昼蛀。您可以將舊按鈕與新按鈕混合使用。

新的國際化和本地化支持

自Flutter創(chuàng)立以來圆存,F(xiàn)lutter已提供您的應(yīng)用程序國際化(i18n)和本地化(l10n)所需的核心功能叼旋。但是,在此版本中沦辙,我們將最佳做法的意見納入了我們的工具中夫植,甚至在添加新的l10n信息時(shí)啟用了熱重裝支持來更新您的應(yīng)用。

如果您想了解有關(guān)Flutter對(duì)l10n的支持的更多詳細(xì)信息怕轿,包括本地化消息偷崩,帶有參數(shù)的消息辟拷,日期,數(shù)字和貨幣阐斜,請(qǐng)閱讀Flutter Internationalization用戶指南衫冻。

此外,如果您對(duì)i18n和l10n感興趣谒出,那么您可能還對(duì)那些字符串不適合普通ASCII字符的字符串感興趣隅俘,例如Unicode和emoji。最近笤喳,Dart團(tuán)隊(duì)發(fā)布了character軟件包为居,該軟件包可幫助開發(fā)人員處理Unicode(擴(kuò)展)字形簇。該軟件包有助于解決諸如如何正確地將字符串(如“ A in text in English”)縮寫為前15個(gè)字符的問題杀狡。使用String類蒙畴,該縮寫為“ A????text in”,它僅是12個(gè)用戶可感知的字符呜象。另一方面膳凝,使用字符包會(huì)產(chǎn)生“ A????text in Eng”的正確縮寫。

通過此PR恭陡,F(xiàn)lutter使用字符包來正確處理這些復(fù)雜字符蹬音。例如,當(dāng)使用具有maxLength限制的TextField時(shí)休玩,像????????這樣的字符現(xiàn)在可以正確地計(jì)為單個(gè)字符著淆。同樣,有了此PR拴疤,在Flutter所在的項(xiàng)目中永部,字符包均可自動(dòng)在項(xiàng)目中使用,而無需手動(dòng)添加遥赚。希望這使得處理來自所有語言環(huán)境的各種字符串變得更加容易扬舒。有關(guān)character包的更多詳細(xì)信息阐肤,請(qǐng)查看出色的文章凫佛,正確完成Dart字符串操作。

Google Maps和WebView插件準(zhǔn)備投入生產(chǎn)

在Flutter小組的這里孕惜,我們通常會(huì)謹(jǐn)慎地將某些標(biāo)簽標(biāo)記為“生產(chǎn)就緒”愧薛,直到我們對(duì)自己進(jìn)行徹底測(cè)試為止。對(duì)于google_maps_flutter和webview_flutter插件衫画,選通因素一直是底層的Platform Views實(shí)現(xiàn)毫炉,該實(shí)現(xiàn)允許將Android和iOS的本機(jī)UI組件托管在Flutter應(yīng)用程序中。在此版本的Flutter中削罩,我們很高興地宣布瞄勾,我們對(duì)框架進(jìn)行了強(qiáng)化费奸,足以將這兩個(gè)插件聲明為可以投入生產(chǎn)。

在Flutter 1.22中进陡,我們添加了替代的Platform Views實(shí)現(xiàn)愿阐,該實(shí)現(xiàn)修復(fù)了所有已知的鍵盤以及Android視圖的可訪問性問題。此外趾疚,它還適用于19級(jí)及以上的Android API(以前要求20級(jí))缨历。我們還在iOS上進(jìn)行了線程改進(jìn),使平臺(tái)視圖更高效糙麦,更可靠(并且不再需要您將io.flutter.embedded_views_preview標(biāo)志添加到iOS Info.plist)辛孵。

webview_flutter插件支持新的Android平臺(tái)視圖模式,但當(dāng)前需要手動(dòng)啟用赡磅。一旦在更廣泛的社區(qū)中得到更多使用魄缚,我們將默認(rèn)在將來的版本中啟用它。

Google Maps和WebView插件已經(jīng)從Platform Views的改進(jìn)中受益焚廊。如果您想使用平臺(tái)視圖在iOS或Android上托管自己的本機(jī)UI組件鲜滩,則可以了解如何在使用平臺(tái)視圖在Flutter應(yīng)用中托管本機(jī)Android和iOS視圖上。

Navigator 2.0

如果您以前在Flutter應(yīng)用程序中使用過導(dǎo)航功能节值,則可能已經(jīng)注意到核心數(shù)據(jù)結(jié)構(gòu)(用戶正在瀏覽的頁面堆棧)對(duì)您而言是隱藏的徙硅。而是要對(duì)其進(jìn)行管理,請(qǐng)調(diào)用Navigator.pop()或Navigator.push()搞疗。舉例來說嗓蘑,假設(shè)您想在首頁上顯示一系列小部件,并允許用戶點(diǎn)擊一個(gè)小部件以轉(zhuǎn)到專門針對(duì)該顏色的詳細(xì)信息頁面匿乃。

實(shí)現(xiàn)如下:

class ColorListScreen extends StatelessWidget {
 final List<Color> colors;
 final void Function(Color color) onTapped;
 ColorListScreen({this.colors, this.onTapped});
 
 @override
 Widget build(BuildContext context) => Scaffold(
       appBar: AppBar(title: Text('Colors')),
       body: Column(
         children: [
           // you can see and decide on every color in this list
           for (final color in colors)
             Expanded(
               child: GestureDetector(
                 child: Container(color: color),
                 onTap: () => onTapped(color),
               ),
             )
         ],
       ),
     );
}
 
class ColorScreen extends StatelessWidget {
 final Color color;
 const ColorScreen({this.color});
 
 @override
 Widget build(BuildContext context) => Scaffold(
       appBar: AppBar(title: Text('Color')),
       body: Container(color: color),
     );
}

使用最簡單的Navigator 1.0樣式桩皿,您可以以看起來非常簡單的方式在這兩個(gè)屏幕之間導(dǎo)航:

class _ColorAppState extends State<ColorApp> {
 List<Color> _colors = [Colors.red, Colors.green, Colors.blue];
 
 @override
 Widget build(BuildContext context) => MaterialApp(
       title: 'Color App',
       home: Builder(
         builder: (context) => ColorListScreen(
           colors: _colors,
           // the Navigator manages the list of pages itself; you can only push and pop
           onTapped: (color) => Navigator.push(
             context,
             MaterialPageRoute(builder: (context) => ColorScreen(color: color)),
           ),
         ),
       ),
     );
}

只需對(duì)Navigator.push()進(jìn)行調(diào)用,即可將第一個(gè)頁面推到第一個(gè)頁面的頂部幢炸,從而創(chuàng)建兩頁的堆棧泄隔。但是,與在ColorListScreen的build方法中創(chuàng)建的Container列表不同宛徊,該堆棧對(duì)您隱藏佛嬉。而且,由于它是隱藏的闸天,因此很難針對(duì)其他情況進(jìn)行管理暖呕,例如處理由本機(jī)嵌入提供的初始路由的深層鏈接,或者來自Web的URL或來自Android的意圖苞氮。管理同一頁面的不同排列之間的嵌套路由也極其困難湾揽。

Navigator 2.0通過使頁面堆棧可見而解決了這些問題,甚至更多库物。這是在相同的ColorListScreen和ColorScreen之間導(dǎo)航的更新示例:

class _ColorAppState extends State<ColorApp> {
 Color _selectedColor;
 List<Color> _colors = [Colors.red, Colors.green, Colors.blue];
 
 @override
 Widget build(BuildContext context) => MaterialApp(
       title: 'Color App',
       home: Navigator(
           // you can see and decide on every page in this list
         pages: [
           MaterialPage(
             child: ColorListScreen(
               colors: _colors,
               onTapped: (color) => setState(() => _selectedColor = color),
             ),
           ),
           if (_selectedColor != null) MaterialPage(child: ColorScreen(color: _selectedColor)),
         ],
         onPopPage: (route, result) {
           if (!route.didPop(result)) return false;
           setState(() => _selectedColor = null);
           return true;
         },
       ),
     );
}

該應(yīng)用程序顯式創(chuàng)建一個(gè)導(dǎo)航器霸旗,并為其提供代表完整堆棧的頁面列表。我們創(chuàng)建一個(gè)空的_selectedColor戚揭,以指示尚未選擇任何顏色定硝,因此我們最初不顯示ColorScreen。當(dāng)用戶選擇一種顏色時(shí)毫目,我們通常會(huì)調(diào)用setState()來向Flutter表示您希望再次調(diào)用build()方法蔬啡,該方法現(xiàn)在會(huì)創(chuàng)建一個(gè)堆棧,其頂部是ColorScreen镀虐。

您可以在OnPopPage回調(diào)中更新狀態(tài)箱蟆,例如,如果用戶彈出刮便,則表示他們已“取消選擇”當(dāng)前顏色空猜,因此我們不再希望顯示該頁面。

如果Navigator 2.0看起來像Flutter的其余部分恨旱,那就是意圖-它是聲明性的辈毯,而Navigator 1.0則是必須的。這個(gè)想法是要在導(dǎo)航和Flutter的其余部分之間統(tǒng)一模型搜贤,同時(shí)解決許多問題并添加功能谆沃。實(shí)際上,這個(gè)小例子幾乎不涉及Navigator 2.0的內(nèi)容仪芒。有關(guān)詳細(xì)信息唁影,我強(qiáng)烈推薦有關(guān)Flutter中的聲明式導(dǎo)航和路由的文章

另外掂名,您對(duì)Navigator 1.0的現(xiàn)有使用將像今天一樣繼續(xù)使用据沈,并且不會(huì)在短期內(nèi)被刪除。如果您喜歡該模型饺蔑,則可以繼續(xù)使用它锌介。但是,如果您嘗試使用Navigator 2.0猾警,我們認(rèn)為您會(huì)喜歡的孔祸。

預(yù)覽:Android的狀態(tài)還原

在此版本中可供您試用的新功能是對(duì)Android狀態(tài)恢復(fù)的支持。這是我們最受歡迎的功能之一肿嘲,擁有217個(gè)大拇指融击!

對(duì)于不熟悉狀態(tài)還原需求的用戶,移動(dòng)操作系統(tǒng)可能會(huì)殺死后臺(tái)的應(yīng)用程序雳窟,以回收前臺(tái)應(yīng)用程序的資源。發(fā)生這種情況時(shí),操作系統(tǒng)會(huì)通知該應(yīng)用被終止以快速保存任何UI狀態(tài)封救,以便在用戶循環(huán)回到該應(yīng)用時(shí)可以將其恢復(fù)拇涤。正確實(shí)施后,可以為用戶提供無縫的體驗(yàn)誉结,同時(shí)可以更好地利用設(shè)備的資源鹅士。到目前為止,F(xiàn)lutter不支持狀態(tài)還原惩坑,沒有框架的支持掉盅,很難正確地進(jìn)行狀態(tài)還原。因此以舒,我們很高興能夠?yàn)锳ndroid提供此功能的基本實(shí)現(xiàn)趾痘。

這是一個(gè)用于恢復(fù)默認(rèn)Flutter Counter應(yīng)用狀態(tài)的非常簡單的示例:

class CounterState extends State<RestorableCounter> with RestorationMixin {
  @override
  String get restorationId => widget.restorationId;

  RestorableInt _counter = RestorableInt(0);

  @override
  void restoreState(RestorationBucket oldBucket) => registerForRestoration(_counter, 'count');

  void _incrementCounter() => setState(() => _counter.value++);

  @override
  Widget build(BuildContext context) => Scaffold(
      body: Center(child: Text('${_counter.value}')),
      floatingActionButton: FloatingActionButton(onPressed: _incrementCounter),
    );
}

簡要地說,每個(gè)小部件都有一個(gè) storage bucket蔓钟,該storage bucket使用唯一的ID向RestorationMixin注冊(cè)永票。通過使用RestorableProperty類型(如此處使用的RestorableInt)來存儲(chǔ)特定于UI的數(shù)據(jù),并通過State Restoration功能注冊(cè)該數(shù)據(jù)滥沫,該數(shù)據(jù)將在Android殺死該應(yīng)用之前自動(dòng)存儲(chǔ)侣集,并在其恢復(fù)正常運(yùn)行時(shí)恢復(fù)。就是這樣兰绣。所有以Restoration *類型存儲(chǔ)的數(shù)據(jù)世分,例如RestorableInt,RestoableString和RestorableTextEditingController(我們都有很多)都將被還原缀辩。而且罚攀,如果我們沒有涵蓋您要還原的所有類型,則可以通過擴(kuò)展RestorableProperty創(chuàng)建自己的類型雌澄。

為了自動(dòng)測(cè)試狀態(tài)恢復(fù)斋泄,我們向WidgetTester添加了新的restartAndRestore API。要進(jìn)行手動(dòng)測(cè)試镐牺,最簡單的方法是在Android設(shè)備上啟動(dòng)啟用了狀態(tài)恢復(fù)功能的Flutter應(yīng)用炫掐,在Android開發(fā)人員設(shè)置中啟用“不要保留活動(dòng)”,運(yùn)行Flutter應(yīng)用睬涧,將其置于后臺(tái)募胃,然后然后回到它。此時(shí)畦浓,Android將終止并恢復(fù)您的應(yīng)用程序痹束,因此您可以查看一切是否按預(yù)期工作。

盡管我們很高興將狀態(tài)恢復(fù)的預(yù)覽版放在您的手中讶请,但還有更多工作要做祷嘶。例如,狀態(tài)恢復(fù)不僅適用于Android,iOS應(yīng)用程序也可以受益论巍。此外烛谊,我們正在忙于更新自己的窗口小部件,以在恢復(fù)過程中保持其狀態(tài)嘉汰。我們已經(jīng)在Scrollable類中提供了支持丹禀,例如ListView和SingleChildScrollView(記住用戶的滾動(dòng)位置)和TextField(恢復(fù)他們輸入的文本),并且我們計(jì)劃將其擴(kuò)展到其他小部件鞋怀。

預(yù)覽:平滑滾動(dòng)以提供不匹配的輸入和顯示頻率

當(dāng)輸入和顯示頻率不同時(shí)双泪,F(xiàn)lutter團(tuán)隊(duì)與Google內(nèi)部合作伙伴合作,極大地提高了滾動(dòng)性能密似。例如焙矛,Pixel 4輸入的運(yùn)行頻率為120hz,而顯示屏的運(yùn)行頻率為90hz辛友。滾動(dòng)時(shí)薄扁,這種不匹配會(huì)導(dǎo)致性能下降。使用新的resamplingEnabled標(biāo)志废累,您可以利用我們?cè)贔lutter中完成的性能工作來解決此問題:

void main() {
  GestureBinding.instance.resamplingEnabled = true;
  run(MyApp());
}

根據(jù)所涉及的頻率差異邓梅,啟用此標(biāo)志可以使?jié)L動(dòng)時(shí)的顫動(dòng)減少多達(dá)97%。當(dāng)我們確定這是最好的體驗(yàn)時(shí)邑滨,我們計(jì)劃在以后的版本中默認(rèn)啟用此標(biāo)志日缨。

新的統(tǒng)一的Dart開發(fā)人員工具

與往常一樣,對(duì)Flutter的更新不僅意味著引擎和框架掖看,還包括工具匣距。 Flutter 1.22包括Dart(2.10)的新版本,還有一個(gè)新的dart CLI工具哎壳,您可能也會(huì)發(fā)現(xiàn)它有用毅待。

Dart歷史上有許多較小的開發(fā)人員工具(例如,用于格式化的dartfmt和用于代碼分析的dartanalyzer)归榕。 Dart 2.10中的新增功能是一個(gè)與Flutter工具非常相似的統(tǒng)一的Dart開發(fā)人員工具尸红。

從今天的Flutter 1.22 SDK開始,您會(huì)發(fā)現(xiàn)/ bin文件夾(您可能在PATH中包含該文件夾)同時(shí)包含flutter和dart命令刹泄。有關(guān)更多詳細(xì)信息外里,請(qǐng)參見Dart 2.10博客文章

應(yīng)用程式大小分析工具

作為Flutter 1.22的一部分發(fā)布的工具包括一個(gè)新的輸出大小分析實(shí)用程序特石。此工具可幫助診斷Flutter盅蝗,您的應(yīng)用大小細(xì)分是否會(huì)隨著時(shí)間變化。

您可以通過將--analyze-size標(biāo)志傳遞給以下任何命令來使用該工具收集分析所需的數(shù)據(jù):

  • flutter build apk
  • flutter build appbundle
  • flutter build ios
  • flutter build linux
  • flutter build macos
  • flutter build windows

在構(gòu)建Flutter輸出工件時(shí)使用此標(biāo)志將打印工件尺寸和組成的摘要姆蘸。這包括本機(jī)代碼墩莫,資產(chǎn)芙委,甚至是已編譯Dart代碼的程序包級(jí)細(xì)分。

此摘要有助于快速識(shí)別應(yīng)用程序的程序包大小用法中的熱點(diǎn)贼穆。此外题山,收集到的數(shù)據(jù)還可以作為JSON文件使用兰粉,供Dart DevTools使用故痊,它使您可以按照flutter.dev上的說明進(jìn)一步瀏覽應(yīng)用程序的內(nèi)容,查明大小問題并查看兩個(gè)不同JSON文件之間的更改玖姑。加載JSON文件后愕秫,您將擁有一個(gè)界面,該界面為您提供應(yīng)用大小的樹狀圖焰络。

有關(guān)您可以使用“應(yīng)用大小”工具執(zhí)行的操作的更多詳細(xì)信息戴甩,請(qǐng)閱讀flutter.dev上的“使用應(yīng)用大小工具”文檔

預(yù)覽:DevTools中更新的網(wǎng)絡(luò)頁面

此版本中的另一個(gè)DevTools預(yù)覽功能是能夠在“網(wǎng)絡(luò)”選項(xiàng)卡中查看HTTP和HTTPs響應(yīng)主體闪彼。

要啟用此功能甜孤,請(qǐng)通過flutter通道dev和flutter通道升級(jí)確保您位于Flutter dev通道上。

此外畏腕,對(duì)于具有大量網(wǎng)絡(luò)流量的應(yīng)用缴川,我們提供了搜索和過濾功能。

有關(guān)“網(wǎng)絡(luò)”選項(xiàng)卡的文檔描馅,請(qǐng)參閱在flutter.dev上使用網(wǎng)絡(luò)視圖把夸。

IntelliJ中的托管DevTools檢查器選項(xiàng)卡

一段時(shí)間以來,我們一直在維護(hù)某些Flutter工具的兩個(gè)副本铭污,例如IntelliJ中的Inspector窗格和Dart DevTools中的Inspector選項(xiàng)卡恋日。這不僅會(huì)減慢我們的速度,因?yàn)槲覀儽仨毦S護(hù)兩個(gè)代碼庫嘹狞,而且某些功能尚未納入IntelliJ插件中岂膳,例如布局資源管理器。因此磅网,為了解決這兩個(gè)問題谈截,我們啟用了直接從IntelliJ內(nèi)部的Dart DevTools托管“檢查器”選項(xiàng)卡的功能。

注意添加了Layout Explorer知市,您可以在代碼旁邊使用它傻盟。要啟用此選項(xiàng),請(qǐng)轉(zhuǎn)至 Preferences > Languages & Frameworks > Flutter > Enable embedded DevTools inspector

改進(jìn)了Visual Studio Code中的輸出鏈接

Flutter開發(fā)人員所面臨的常規(guī)活動(dòng)是從終端或堆棧跟蹤中的錯(cuò)誤輸出中進(jìn)行嫂丙。在適用于Visual Studio Code的Flutter擴(kuò)展的最新版本中娘赴,現(xiàn)在可以正確解析這些鏈接,以使您可以直接從輸出中啟用鏈接跟啤。

看來這是一件小事诽表,但是對(duì)于此功能的初步反饋已經(jīng)非常積極唉锌。

與往常一樣,此處的工具更改列表太多竿奏,但是我建議以下公告以了解詳細(xì)信息:

客戶關(guān)注點(diǎn):EasyA

EasyA是一款訂閱應(yīng)用程序袄简,旨在使適齡學(xué)生通過即時(shí)消息與出色的導(dǎo)師聯(lián)系,并使用Flutter編寫泛啸。最近绿语,它被Apple推薦為“每日應(yīng)用程序”。

“當(dāng)學(xué)校在今年初開始上網(wǎng)時(shí)候址,我們知道我們需要快速啟動(dòng)輔導(dǎo)應(yīng)用程序來幫助學(xué)生吕粹。 Flutter的驚人發(fā)展速度意味著我們能夠?yàn)閕OS和Android實(shí)施屢獲殊榮的設(shè)計(jì),并且還可以發(fā)布到Web上—及時(shí)鎖定岗仑!通常匹耕,這實(shí)際上是不可能的。但是荠雕,由于Flutter允許我們同時(shí)針對(duì)所有三個(gè)平臺(tái)稳其,因此我們能夠高效地共享代碼,并充分利用我們的小型開發(fā)人員團(tuán)隊(duì)炸卑〖染希”

EasyA聯(lián)合創(chuàng)始人Phil Kwok

重大變化

與往常一樣,我們?cè)噲D將重大更改的數(shù)量保持在最少矾兜。以下是Flutter 1.22版本中的列表损趋。

概要

Flutter 1.22穩(wěn)定版可能在上一版本之后很快問世,但是其中包含很多好東西椅寺,因此本篇文章無法一一列舉浑槽。我們希望此版本可以幫助您為iOS和Android開發(fā)出色的應(yīng)用程序,我們迫不及待想看到您的商店中有什么返帕!感謝您的支持-我們?yōu)槟蛟霧lutter桐玻。

交流

老孟Flutter博客(330個(gè)控件用法+實(shí)戰(zhàn)入門系列文章):http://laomengit.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荆萤,隨后出現(xiàn)的幾起案子镊靴,更是在濱河造成了極大的恐慌,老刑警劉巖链韭,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偏竟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡敞峭,警方通過查閱死者的電腦和手機(jī)踊谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旋讹,“玉大人殖蚕,你說我怎么就攤上這事轿衔。” “怎么了睦疫?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵害驹,是天一觀的道長。 經(jīng)常有香客問我蛤育,道長宛官,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任缨伊,我火速辦了婚禮摘刑,結(jié)果婚禮上进宝,老公的妹妹穿的比我還像新娘刻坊。我一直安慰自己,他們只是感情好党晋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布谭胚。 她就那樣靜靜地躺著,像睡著了一般未玻。 火紅的嫁衣襯著肌膚如雪灾而。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天扳剿,我揣著相機(jī)與錄音旁趟,去河邊找鬼。 笑死庇绽,一個(gè)胖子當(dāng)著我的面吹牛锡搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞧掺,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼耕餐,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了辟狈?” 一聲冷哼從身側(cè)響起肠缔,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哼转,沒想到半個(gè)月后明未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壹蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年趟妥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庶溶。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煮纵,死狀恐怖懂鸵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情行疏,我是刑警寧澤匆光,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站酿联,受9級(jí)特大地震影響终息,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贞让,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一周崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喳张,春花似錦续镇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舅桩,卻和暖如春酱虎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擂涛。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工读串, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撒妈。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓恢暖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踩身。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胀茵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359