本文由 愛學園平臺 進行聯合編輯整理輸出android
原做者:愛學園——莫比烏斯環ios
這是 Flutter 系列文章的第二篇,關於 Flutter 的相關學習文章後面還有不少,若是您喜歡的話,請持續關注 ,謝謝!web
Flutter 是 Google 推出的移動端跨平臺開發框架,使用的編程語言是Dart,是繼 React Native 以後開發者對跨平臺解決方案的又一探索,追其根源,本質上以移動端的統一爲走向,縮短人力、物力、時間!這是開發者、企業的共同目標。本篇咱們以一個簡單的 Flutter 應用,爲你們講解 Flutter 應用的開發流程。編程
咱們本篇的主旨是讓用戶對 Flutter 應用的建立、調試、打包、安裝等過程有一個直觀的認識。在你們的記憶中是否是學習一門語言,都是以 Hello World 開始的,Flutter 也不例外,今天咱們以一個 Hello Flutter 應用開啓咱們的第一次~,界面很是簡單,主要就是界面上展現一個計數器,隨着用戶的點擊累加。json
在建立項目以前,你須要配置開發環境,若是你尚未完成此操做,請移步開發環境搭建,若是已完成,請跳過,這裏咱們經過Android Studio編譯器來建立工程。bash
android
Android 平臺相關代碼ios
IOS 平臺相關代碼build
項目編譯產生的目錄,此時不須要關心(後期編譯的安裝包輸出在該目錄下)lib
跨平臺代碼,也是 Flutter 項目主要關心的目錄test
測試相關代碼pubspec.yaml
項目描述文件,至關於 NodeJs 項目的 package.json
,裏面包含了項目的描述信息以及所須要的依賴的庫lib/main.dart
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new Scaffold(
appBar: new AppBar(
title: new Text('Welcome to Flutter'),
),theme: new ThemeData(
primarySwatch: Colors.blue,
),
body: new Center(
child: new Text('Hello Flutter'),
),
),
);,
);
}
}
複製代碼
分析app
main
函數(執行入口)使用了(=>
)符號,這是Dart中單行函數或方法的簡寫。StatelessWidget
,這說明應用自己也是一個 Widget
。Scaffold
是Material library中提供的一個widget,它提供了默認的導航欄、標題和包含主屏幕widget樹的body屬性。Widget
的主要工做是提供一個build()
方法來描述如何根據其餘較低級別的widget來顯示本身。修改工程使其按照咱們的設想變動,在屏幕上添加一個展現文本控件和一個可點擊按鈕,所以咱們須要按照以下步驟修改入口文件:lib/main.dart
。框架
這裏咱們須要明白如下幾個概念:less
在這一步,添加一個有狀態的widget--MyHomePage,它建立其State類_MyHomePageState。這裏咱們將MyHomePage做爲一個widget添加到現有的無狀態widget--MyApp內部。編程語言
建立一個State類,添加到main.dart
的底部:
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
複製代碼
添加 _MyHomePageState 類,該應用程序的大部分邏輯和狀態管理代碼都在該類中,這個類保存屏幕上用戶點擊的次數,隨着用戶的點擊,次數不斷增長,且展現在界面上,代碼以下:
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(
'You have pushed the button this many times:',
),
new Text(
"$_counter",
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: new FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: new Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
複製代碼
替換MyApp中的build方法內部home參數爲新定義的MyHomePage widget,代碼以下:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Welcome to Flutter',
theme: new ThemeData(
primarySwatch: Colors.green,//變動主題樣式
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
複製代碼
重啓應用程序。模擬器上的行爲應該變動以下,展現一個計數器和按鈕,點擊按鈕,文本計數增長(這裏樣式作了下調整),效果以下:
修改界面代碼,樣式,保存後界面數字並無從零開始,這說明熱重載與重啓的區別,它只是單純的改變相應的變化,State的狀態會持續保存。
到此咱們應用就改造完畢!代碼很簡單,咱們這裏主要想讓讀者明白的是建立一個Flutter應用的流程、組成部分和一些簡單配置。
一種採用debug模式調試,中止當前應用,點擊頂部工具欄Debug main.dart
小按鈕,啓動應用,你能夠在您須要監測代碼處像原生同樣打個斷點,這裏同原生並沒有兩樣,不作詳細講解。 另外一種log日誌輸出方式調試:
debugPrint("message info ...")
複製代碼
這裏只簡單介紹下,不是本章的重點,此處不作詳細分析,更多的調試方法讀者能夠根據須要查看https://flutter.io/debugging/ 進一步學習。
應用通過運行、測試,最後確定須要安裝到真機上,所以須要打包apk分發給用戶使用。以下咱們將分析Flutter如何進行項目打包(Android)。
build.gradle
,這裏同上同樣也可作一些配置,好比說自動化簽名配置,資源壓縮,代碼混淆配置等等;flutter build apk
,輸出apk安裝包到build/app/outputs/apk/release/app-release.apk
;flutter install
就能夠安裝這個apk了。閱讀完上述步驟我想您在下面幾個方面會有深刻的思考:
對於IOS的開發,讀者能夠看https://flutter.io/ios-release/,這裏就再也不詳細描述了。好吧到這裏您的第一個Flutter應用應該完成了吧。若是遇到問題能夠留言咱們一塊兒討論,謝謝!