Flutter初探分析

最新消息

Flutter在12月5號(hào)發(fā)布了最新的穩(wěn)定版本1.0,象征著Flutter新技術(shù)提上了征程功戚,期待著他能靠一己之力改變移動(dòng)端開的格局!
Flutter1.0官方推文

Let’s go

以下為正文你辣,推薦官網(wǎng)APIFlutter,如果覺l得英文看著費(fèi)勁[Flutter中文網(wǎng)(https://flutterchina.club/)隶糕,但是其更新速度比官網(wǎng)慢一下抑堡,我在寫的時(shí)候還沒有更新到1.0版本。

引言

移動(dòng)端至少分為3大格局掖举,Android開發(fā)快骗,iOS開發(fā)和React Native開發(fā)。React Native將iOS和Android的開發(fā)平臺(tái)相互融合通過js解釋器構(gòu)建塔次,完成開發(fā)一次方篮,兩端都能使用的技術(shù)方案。但是React Native技術(shù)是FaceBook開發(fā)的励负,拋開技術(shù)性問題不談藕溅,其開源類型非BSD項(xiàng)目,F(xiàn)aceBook還是對(duì)其擁有控制權(quán)继榆,所以大公司都摒棄了React native的開發(fā)巾表。(具體協(xié)議可自行查看)。

簡(jiǎn)介

Flutter是谷歌的移動(dòng)UI框架略吨,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面集币。 Flutter可以與現(xiàn)有的代碼一起工作。在全世界翠忠,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用鞠苟,并且Flutter是完全免費(fèi)、開源的。(除非特別說明偶妖,其開源協(xié)議是BSD模式)

歷程
歷程.png
環(huán)境構(gòu)建

(筆者為android開發(fā),只細(xì)談安卓方向)

  • FlutterSDK1.0 政溃、AndroidSDK趾访、jdk8.0、Dart插件
  • Android studio 董虱、IDE扼鞋、VS Code等任何編輯器


    Android Studio編譯.png
構(gòu)建方式

Flutter與用于構(gòu)建移動(dòng)應(yīng)用程序的其他大多數(shù)框架不同,因?yàn)镕lutter既不使用WebView愤诱,也不使用操作系統(tǒng)的原生控件云头。相反,F(xiàn)lutter使用自己的高性能渲染引擎來繪制界面

Flutter架構(gòu)層級(jí).png

Flutter中使用輕量的C++構(gòu)建底層淫半,使用Dart語言開發(fā)編譯溃槐,使用Skia 2D渲染引擎渲染自己的weight控件。

Flutter技術(shù)要點(diǎn)
1.widget

簡(jiǎn)單的可以理解為view科吭,整個(gè)Flutter應(yīng)用都是使用的widget樹構(gòu)建UI昏滴,在構(gòu)建過程中使用不同的widget控間嵌套來實(shí)現(xiàn)界面。
1).StatelessWidget
沒有狀態(tài)的組建对人,StatelessWidget創(chuàng)建一次谣殊,永遠(yuǎn)不會(huì)改變其外觀,在build中搭建widget樹布局牺弄。


StatelessWidget.png

2).StatefulWidget
根據(jù)收到的數(shù)據(jù)或yoghurt輸入動(dòng)態(tài)更改狀態(tài)姻几,creatState中創(chuàng)建一個(gè)State對(duì)象,而其State對(duì)象存在生命周期势告,可以進(jìn)行setState操作動(dòng)態(tài)更新界面的顯示蛇捌。


StatefulWidget.png

State存在生命周期如下:

state生命周期.png

其中reassemble:是在開發(fā)中的熱更新才會(huì)調(diào)用的生命周期,這是與rn不同的地方培慌。

2.實(shí)現(xiàn)網(wǎng)絡(luò)加載

使用http請(qǐng)求豁陆,調(diào)用dio第三方庫(kù)獲取數(shù)據(jù)渲染到界面中,使用async await返回Future對(duì)象吵护。

3.與原生交互(Android)

Android中:

public class FlutterToNative implements MethodChannel.MethodCallHandler {
    public static String NAME = "com.kang.economicanalysis/plugin";
    private Activity activity;

    FlutterToNative(Activity activity){
        this.activity = activity;
    }

    public static void registerWidth(PluginRegistry.Registrar registrar){
        MethodChannel channel = new MethodChannel(registrar.messenger(), NAME);
        FlutterToNative instance = new FlutterToNative(registrar.activity());
        //setMethodCallHandler在此通道上接收方法調(diào)用的回調(diào)
        channel.setMethodCallHandler(instance);
    }

    @Override
    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
        //通過MethodCall可以獲取參數(shù)和方法名盒音,然后再尋找對(duì)應(yīng)的平臺(tái)業(yè)務(wù),本案例做了2個(gè)跳轉(zhuǎn)的業(yè)務(wù)

        //接收來自flutter的指令oneAct
        if (methodCall.method.equals("ToOne123")) {

            //跳轉(zhuǎn)到指定Activity
            Intent intent = new Intent(activity, OneActivity.class);
            activity.startActivity(intent);

            //返回給flutter的參數(shù)
            result.success("success");
        }
        //接收來自flutter的指令twoAct
        else if (methodCall.method.equals("ToOne")) {

            //解析參數(shù)
            String text = methodCall.argument("flutter");

            //帶參數(shù)跳轉(zhuǎn)到指定Activity
            Intent intent = new Intent(activity, OneActivity.class);
            intent.putExtra("flutter", text);
            activity.startActivity(intent);

            //返回給flutter的參數(shù)
            result.success("從原生傳回來的參數(shù)");
        }
        else {
            result.notImplemented();
        }
    }
}

在MainActivity中進(jìn)行調(diào)用:

public class MainActivity extends FlutterActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
    //交互
    FlutterToNative.registerWidth(registrarFor(FlutterToNative.NAME));
  }
}

flutter代碼中:

//獲取到插件與原生的交互通道
  static const jumpPlugin = const MethodChannel('com.kang.economicanalysis/plugin');
//原生交互傳遞值馅而,獲取返回值SetState更新到UI中
Future<Null> _ToNative() async {
    Map<String, String> map = { "flutter": "flutter" };
    String result = await jumpPlugin.invokeMethod('ToOne', map);
    setState(() {
      _data = result;
    });
  }

這樣就結(jié)束了祥诽!
在Flutter中使用的是通道的方式構(gòu)建與原聲的交互,通道建立完畢后隨時(shí)調(diào)用瓮恭,隨時(shí)通信雄坪,還可以使用這種方式拓展控件,例如:flutter不支持webview屯蹦,可以使用Android原生的webview通過addContentView()维哈,添加到Flutter使用绳姨。flutter-webview

底層架構(gòu)對(duì)比

React Native使用js語言開發(fā),形式模仿React框架阔挠,執(zhí)行需要js解釋器飘庄,UI通過原生控件渲染。


React Native.png

Flutter直接使用原生的canvas购撼,在其自帶的Skia 2D引擎上渲染UI跪削,不通過間接轉(zhuǎn)換,節(jié)省時(shí)間


Flutter.png
與React Native對(duì)比

1.開發(fā)差異:

  • 基于js的ES6開發(fā)迂求,遵循react前端框架開發(fā)
  • 使用Dart語言開發(fā)碾盐,純面向?qū)ο箝_發(fā),使用widget搭建布局

2.友好性:

  • Flutter對(duì)Android友好
  • React Native對(duì)iOS友好

3.控件影響

  • Flutter控件是由自己定義的揩局,所以其渲染速度十分快速毫玖,
  • Flutter的控件在iOS和Android上的效果基本完全一致,而React Native存在將RN控件轉(zhuǎn)換為原生控件的過程凌盯,存在一定的差異孕豹。
  • 在Android和iOS的控件發(fā)生更新后需要將更新同時(shí)更新到Flutter的控件中,由于是一家公司十气,所以Android控件容易更新励背,然而iOS控件的更新可能較慢。

4.效率:

  • Flutter的渲染UI效率較高砸西,刷新率高叶眉,F(xiàn)PS較高。

5.動(dòng)態(tài)化:

  • Flutter目前不支持代碼的熱更新芹枷,但是開發(fā)者給出思路(Dart to JS)
  • React Native加載jsbundle文件衅疙,目前存在多種熱更新方案。

6.App體積:

  • iOS Flutter>React Native (iOS需要額外集成skia引擎鸳慈,而android自帶)
  • Android Flutter<React Native (Android中加入OkHttp導(dǎo)致體積增大)
  • Flutter預(yù)覽版更新后App體積再次縮小30%

7.平板適配性:

  • Flutter沒有對(duì)平板進(jìn)行適配

8.兼容性:

  • Flurrer提供的widget都是基于skia引擎實(shí)現(xiàn)和精心定制的饱溢,與具體平臺(tái)沒有關(guān)系,所以能保持很高的跨OS跨OS Version的兼容性走芋。flutter從更基礎(chǔ)的曾磨平了平臺(tái)的差異绩郎,站在更寬廣、更可控的一個(gè)基礎(chǔ)平臺(tái)上去演變和發(fā)展翁逞。

9.穩(wěn)定性:

  • Flutter才出現(xiàn)穩(wěn)定1.0版本肋杖,而RN已經(jīng)出來3年了,所以React Native的穩(wěn)定性更好
其他
  • '_'代表私有挖函,可修飾成員和類
  • 使用Router和Navigator實(shí)現(xiàn)路由導(dǎo)航(push/pop, eg:pushAndRemoveUtil == SingleTask)
  • 支持動(dòng)畫状植、手勢(shì)、暫不支持Echarts
  • 打包形式與原生相同
  • colors 只支持16進(jìn)制
  • 資源文件需要在配置文件pubspec.yaml中引用方可使用
總結(jié)
  • 總體上來說,F(xiàn)lutter的技術(shù)比React Native技術(shù)更加新穎津畸,性能更好振定,渲染速度更快,各方面都更加優(yōu)秀肉拓,而且Flutter的開源模式為BSD吩案,也優(yōu)于React Native。
  • Flutter出來的時(shí)間只有1年帝簇,所以不是很成熟,穩(wěn)定性較差靠益,所以如何選擇就看你們了丧肴!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胧后,隨后出現(xiàn)的幾起案子芋浮,更是在濱河造成了極大的恐慌,老刑警劉巖壳快,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纸巷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡眶痰,警方通過查閱死者的電腦和手機(jī)瘤旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竖伯,“玉大人存哲,你說我怎么就攤上這事∑哂ぃ” “怎么了祟偷?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)打厘。 經(jīng)常有香客問我修肠,道長(zhǎng),這世上最難降的妖魔是什么户盯? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任嵌施,我火速辦了婚禮,結(jié)果婚禮上莽鸭,老公的妹妹穿的比我還像新娘艰管。我一直安慰自己,他們只是感情好蒋川,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布牲芋。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缸浦。 梳的紋絲不亂的頭發(fā)上夕冲,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音裂逐,去河邊找鬼歹鱼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卜高,可吹牛的內(nèi)容都是我干的弥姻。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼掺涛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庭敦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起薪缆,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤秧廉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拣帽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疼电,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年减拭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔽豺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拧粪,死狀恐怖茫虽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情既们,我是刑警寧澤濒析,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站啥纸,受9級(jí)特大地震影響号杏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斯棒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一盾致、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荣暮,春花似錦庭惜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠遏。三九已至,卻和暖如春骏啰,著一層夾襖步出監(jiān)牢的瞬間节吮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工判耕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透绩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓壁熄,卻偏偏與公主長(zhǎng)得像帚豪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子草丧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你狸臣,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,753評(píng)論 2 59
  • 看完毛姆的《月亮與六便士》统翩,你會(huì)發(fā)現(xiàn)仙蚜,整本書看下來,書中既沒有出現(xiàn)月亮厂汗,也沒有出現(xiàn)六便士委粉。這個(gè)聞名中外的書名只不過...
    藍(lán)寧讀書室閱讀 526評(píng)論 0 2
  • 于丹曾經(jīng)特意就儀式感寫了文章,她認(rèn)為與古人相比娶桦,今天的中國(guó)人的生活方式似乎少了一些情趣贾节,生活節(jié)奏越來越匆忙,生命中...
    林九兒閱讀 332評(píng)論 0 0
  • 工作的意義是什么?在非虛構(gòu)作品《當(dāng)美國(guó)人談?wù)撍麄兊墓ぷ鳌防锲碚绹?guó)記者鮑采訪了不同階層斤程、不同年齡的美國(guó)人,傾聽他們講...
    宋小麗閱讀 787評(píng)論 0 0
  • 小孩子晚睡會(huì)不會(huì)影響寶寶的智力以及發(fā)育疚脐?這已經(jīng)成為許多家長(zhǎng)們關(guān)心的問題。特別是現(xiàn)代生活邢疙,有了電視棍弄、電腦望薄、手機(jī),寶媽...
    有習(xí)慣閱讀 228評(píng)論 0 0