Flutter開發App簡介

簡介

今天給大家介紹的是Dart2Flutter

Dartgoogle推出的一種新的腳本語言, 希望能替代JS,

然而JS也在迭代升級, 生命力很旺盛,

目前, Dart還沒能替代JS.

現在最新的Dart2, 據說相比1改變很多.

所以我直接介紹dart2.

Fluttergoogle推出的跨平臺開發框架, 類似於React-native.

不過相比於React-native, 它的性能更有優勢.

 

支持IOS, Android

•谷歌的開源移動UI框架
•支持iOS App和Android App
•調試時支持熱重載
•內置Material Design, Cupertino
•簡易的包管理
•接近原生的性能
                     
Flutter是谷歌大力推進的開源項目, 據說更新迭代很快, 我在學習的這段時間確實遇到有幾次更新提醒. 同時支持iosandroid.,調試時支持熱重載. 網站描述調試過程中如果崩潰了, 還可以修復崩潰點繼續熱重載. 這一點react-native還沒做到.
Flutter提供了兩套組件庫Material Design是google主推的設計, 而Cupetino是apple主推的設計.
自動化包安裝是在代碼的配置裏寫上要引用的包和版本號IDE就可以輕鬆的將正確的包同步到本地. 相比npm管理包更輕鬆. 不過這個過程的進度信息比較少. 從官方的介紹看, 性能比ReactNative更接近原生的app.
 

環境搭建

 

1. 下載Flutter SDK, 解壓到C盤.

是一個zip包, 解壓到C盤, 因爲擔心權限問題, 要求不要放到program Files.

https://flutter.io/sdk-archive/#windows

2. 將c:/flutter/bin添加到環境變量path

3. 添加兩個環境變量的添加是爲避免國內訪問不到有些地址,

export PUB_HOSTED_URL=https://pub.flutter-io.cn

export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn                                            

4. 升級和檢查

flutter doctor

flutter upgrade

5. 設置編輯器

vscode Extensions: Install  Flutter

6. android studio安裝

7. android studio安裝flutter插件

8. android studio配置虛擬安卓設備.

Dart語言

 

Dart類似於JS, 可以應用於web, server等應用場景, flutter框架下也支持了移動端開發.

1.  需要main入口才能運行.

2. Raw字符串, 不會發生轉義

3. 多行字符串, 考慮到代碼上加的空格也會體現出來, 所以如果用這種方法, 又不想要這些空格, 會破壞代碼的整體美觀.

4. 字符串中嵌入變量, 相比JS有些簡化

5. Future相比Promise簡便一點. 並且它可以加一個Duration來完成timeout的工作.

6.  async/wait可以應用場景可以更自由. 比如for循環

還有一些沒在這裏演示, 比如類型繼承, class extend, 類型安全等跟ts就比較像了.

最大的優點是具備JS的大部分優點, 所以容易上手. 又去掉了JS的大部分缺點, 比如隱式轉換.

創建Flutter App

1. 創建Flutter工程

     vscode命令也可以, 在命令行中輸入flutter new, 填入名字, angular-cli類似, 就能生產一堆代碼.

2. Vscode打開工程, 左側可以看到android, ios各自產生的相應的工程, lib/main.dart就是業務層代碼了.

    其它的大部分可以不用管, 不過這裏有一個pubspec.yaml是一個包管理文件, 類似與package.json.

3.  找到lib/main.dart

     寫上這些代碼
4.  F5運行, 選擇虛擬設備, 將會看到虛擬設備顯示出實現的界面. (調試支持熱重載)

這個例子中, 首先是main()的入口 調用 runApp創建app對象運行起來.

App對象從statelessWidget創建. 所謂statelesswidget就是屬性不可變的widget意思.

widget是所有控件的基類.

Widget最基本的方法就是buildsetState

類似於Reactrender.

這裏@override表示extend出來的子對象覆蓋widgetbuild方法.

flutter裏絕大部分的可見或不可見的界面元素都是widget, 整個頁面, 路由的頁面, 容器, , , 甚至是padding.

MaterialAppmaterial組件之一, 提供整體的屬性的定義.

比如整體的風格, 顏色, 名稱

Scaffold提供默認的導航欄, 標題, body等屬性的定義.

Appbar標題欄

Text控件

Center是一個佈局控件, 可以把子對象擺在中間, 像有圖所示.

這裏的名稱加冒號的傳參方式, 前面解釋了,

是可選參的傳遞方式,不限定傳參順序.

 
 

StateFulWidget狀態控件

 

這個例子要演示的是StateFulWidgetStateLessWidget的不同.

這裏引入了一個能產生隨機單詞的外部包.

這裏的外部包引用只需要在yaml填入包名稱和版本號,

然後觸發flutter: get package命令就會完成包引用和更新.

這裏需要注意的是, 縮進的多少會影響語義.

這裏可以看到, StatefulWidgetoverride createState 函數

返回一個new 的對象state<RamdomWords>模板參數又引用了前面這個類型,

這個寫法有點奇怪, 有一種循環引用的錯覺. 不過實際上並不是循環引用.

然後再在這個state<>override 一個build方法.

state有變化時, 會觸發build, 也可以手動觸發.

這裏裏面放入一個listView listTile構成一個列表.

每次滾動到底部, 都會觸發itemBuilder傳入新的i.

到了這裏我們對FlutterDart就有了一個初步的瞭解了.

接下來看一下Flutter的架構.

 

Navigator導航

 

Routeflutter中通過navigator來管理.

支持兩種方式來做路由, 一種是stack push pop,

另一種就是常見的路徑和頁面映射.

這裏演示的是第一種, 因爲手機最常見的情況是跳轉, 然後返回.

navigtorpush, pop, 操作widget對象來完成頁面的跳轉.

這種widget叫做MaterialPageRoute.

這裏有一個navigator的例子, 實現的效果, 就是

點擊右上角的按鈕之後, 跳轉到收藏頁面,

點擊返回又可以回到主頁面.

代碼實現是在右上角增加一個按鈕的onPress事件觸發

這個navigator.of是從當前的context也就是這個materialAppnavigator.

然後push一個MaterialPageRoute

Builder方法裏返回一個Scofold頁面就行了.

這裏可以看到context包含app的環境信息或對象

MaterialApp的的routes屬性可以設置路由路徑和頁面之間的映射關係.

new MaterialApp(

routes: <String, WidgetBuilder> {

     '/a': (BuildContext context) => new MyPage(title: 'page A'),

     '/b': (BuildContext context) => new MyPage(title: 'page B'),

}

除此以外, route還可以嵌套, 也就是說, app這一層是根路由,

而根路由裏面的page還可以嵌入子路由, navigator.of訪問context

按照就近原則獲取當前的路由進行操作.

 
 
 

Icons.xxx圖標

 

官方的圖標庫集成了內部的接口, 方便直接加載, 基於矢量. 操作便捷, Icons.xxx就可以加載這個圖標.

但是, 如果沒有自己想要的圖標還是需要通過圖片加載的方式.
 
 
 

Layout佈局

 

這裏是對佈局的演示,

Flutter的佈局有一個特點, 就是它不用負責告訴它的父節點, 自己要顯示在哪裏.

主要是每種容器通過row, colum, list, card, gridview等容器來管着子節點的顯示,

然後再容器的屬性可配置主軸, 縱軸的對齊方式, padding, margin, border.

childrenchild嵌入子節點. 理解起來還是比較簡單的.

另外, 對於全局的風格, materialApp中也有屬性進行定義.

Animation動畫

 Animation:

        1. 按時間階段輸出.value

        2. 監聽狀態(forward, backward, completed, dismissed)

    AnimationController:

        1. .forward, .backward控制向前向後

        2. 設置變化的時長

    CurvedAnimation:

        1. 曲線變化(fastOutSlowIn, bounceIn, elasticInOut, 可自定義)

        2. AnimationControllerCurves組合出一個Animation對象

    Tween(Animatable):

        1. 設置Animation值變化範圍

        2. .evaluate(Animation)通過Animation可計算當前值

        3. .animate(AnimationController)可以返回一個Animation

Pubspec.yaml環境配置文件

Pubspec.yaml文件, 配置包,類似於node.js的package.json文件.

前面提到配置的包在這裏有修改的話,

會可以自動觸發更新

相比npm install在編寫代碼再去輸入命令要更便捷一點.

命令也支持.

然而這個國外的源可能被封禁, 所以經常get失敗,

谷歌說提供了一個國內的源, 但是實際使用的時候, 發現效果也是很差.

另外還可以配置圖片, 自定義字體, 本地語言等.

GestureDetector手勢檢測

•onTapDown :                     指針已經在特定位置與屏幕接觸
•onTapUp :                           指針停止在特定位置與屏幕接觸
•onTap tap:                          事件觸發
•onTapCancel :                    先前指針觸發的onTapDown不會在觸發tap事件
•onDoubleTap :                   用戶快速連續兩次在同一位置輕敲屏幕.
•onLongPress :                    指針在相同位置長時間保持與屏幕接觸
•onVerticalDragStart :        指針已經與屏幕接觸並可能開始垂直移動
•onVerticalDragUpdate :    指針與屏幕接觸並已沿垂直方向移動.
•onVerticalDragEnd :          與屏幕接觸並垂直移動的指針不再與屏幕接觸
•onHorizontalDragStart :    指針已經接觸到屏幕並可能開始水平移動
•onHorizontalDragUpdate:  指針與屏幕接觸並已沿水平方向移動
•onHorizontalDragEnd :      與屏幕接觸並水平移動的指針不再與屏幕接觸

 

大多數控件有onPress事件, 但是手機上的手勢行爲很多

因此並沒有讓每一個控件支持所有手勢的屬性,

所以如果想要獲得哪些手勢就需要使用GetureDetector

GetureDetector本身也是一種widget把它和其它控件重疊放在一起,

或者把其它控件作爲GetureDetector的子控件.

它就可以檢測到這個控件上發生的手勢動作.

這裏列舉了可支持的手勢動作.

 

Inspector

調試上除了傳統的斷點單步調試, 也一樣支持inspector和性能分析

不過提供的inspector支持不在vscode., 而是intelliJ,

可以查看節點層次和節點屬性, 只不過不能直接在inspetor裏面修改屬性.

android studio是基於intelliJIDE, 所以也是支持的.

 

Platform-Specific

Flutter與平臺之間通過通信

每個API都有一個獨立的路徑, 獲得路徑對應的methodchannel對象

然後通過.invokeMethod(funcName)來訪問接口.

這裏爲防止阻塞使用了async await.

已有的這些訪問API的路徑包含

如果開發發現還不夠, 可以自己在native開發這一層

添加自定義的API路徑和native api之間的映射.

而數據的返回有兩種形式, 一種從result.success, result.error阻塞式返回.

另一種是通過event.

 

Achitecture架構

Flutter的框架從上到下分三個大層:

FrameWork主要包含UI組件(MaterialCupertino widgets)也包含:

     widgets, Animation, getstures

Engine主要是指Dart的引擎, 還包括

     Event, pipeline, 服務協議, 渲染等.

Embedder主要是native層的一些接口和線程, 事件, 包管理等.

根據介紹Flutter相比React最大的優勢在於,

在上層就完成了render, 避免了diff變化的層層傳遞. 所以性能更好.

 
 
 

Publish打包發佈

打包和發佈, 在各自的平臺有一些不同的操作流程.

 
本文參考:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章