咱們先來搬運官網的一段介紹,讓你們有一個直觀的認識:前端
Flutter是谷歌的移動UI框架,能夠快速在 iOS 和 Android 上構建高質量的原生用戶界面。
Flutter能夠與現有的代碼一塊兒工做。在全世界,Flutter正在被愈來愈多的開發者和組織使用,而且Flutter是徹底免費、開源的。
複製代碼
簡而言之bash
舒適提示app
這些咱們都不講,今天咱們聊一下 Flutter Widget 。讓咱們開始吧~框架
Widget 描述了在當前的配置和狀態下,視圖所應該 呈現的樣⼦。當 Widget 的狀態改變時,它會從新構 建其描述(展現的 UI),框架則會對⽐先後變化的 不一樣,以肯定底層渲染樹從⼀個狀態轉換到下⼀個狀 態所需的最⼩更改。less
Widget 組合的結構是樹,因此叫Widget 樹。樹中包含ide
根Widget
(經常使用)
】父Widget
子Widget
// main.dart
import 'package:flutter/material.dart'; //風格須要先導入哦~
import 'my_home_page_widget.dart';
void main() => runApp(MyApp()); //Flutter會默認把 根Widget 充滿屏幕
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData.light(),
home: MyHomePage(title: 'Vava熊の日記'),
);
}
}
複製代碼
graph LR
Widget配置--> Element1
Widget配置--> Element2
Widget配置--> Element3
Widget配置--> ...
複製代碼
由於渲染是很耗性能的,爲了提升 Flutter 的幀率,就要儘可能減小沒必要要的 UI 渲染,因此 Flutter 根據 UI 是否有變化,將 Widget 分爲StatelessWidget
&& StatefulWidget
。函數
StatelessWidget
和StatefulWidget
都是直接繼承自Widget類,它們引入了兩種Widget模型,接下來咱們將重點介紹一下這兩個類。性能
StatelessWidget是不可變狀態的 Widget 抽象類, 只能在加載/構建 Widget 時才繪製一次,沒法基於任何事件或用戶操做重繪。因此 StatelessWidget生命週期就只有一個
,即 build
函數。ui
// main.dart
import 'package:flutter/material.dart';
import 'stateless.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData.light(),
home: MyStatelessApp("123 木頭人,不準動 ——from Vava熊")
);
}
}
複製代碼
//stateless.dart
import 'package:flutter/material.dart';
class MyStatelessApp extends StatelessWidget {
final String content;
MyStatelessApp(this.content);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar:AppBar(
title: Text('StatelessWidget'),
),
body:Center(
child: Text(content),
)
);
}
}
複製代碼
每點擊文本一次,body文本中就會多一次‘贊’this
// main.dart
import 'package:flutter/material.dart';
import 'stateful.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData.light(),
home: MyStatefulApp("Vava熊の一天")
);
}
}
複製代碼
//stateful.dart
import 'package:flutter/material.dart';
class MyStatefulApp extends StatefulWidget {
String content;
MyStatefulApp(this.content);
@override
State<StatefulWidget> createState() {
return MyStatefulAppState();
}
}
class MyStatefulAppState extends State<MyStatefulApp> {
bool isShowText =true;
void increment(){
setState(() {
widget.content += "贊";
});
}
//build() 方法在 didChangeDependencies()(或者 didUpdateWidget() )以後調用
@override
Widget build(BuildContext context) {
return Scaffold(
appBar:AppBar(
title: Text('StatefulWidget及State'),
),
body:Center(
child: GestureDetector(
child: isShowText? Text(widget.content) :null,
onTap: increment,
)
)
);
}
//-------only 生命週期 log------------
//建立 State 對象後要調用的第一個方法
@override
void initState() {
super.initState();
print("initState");
context.runtimeType;
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
print("didChangeDependencies");
}
//runtimeType 和 Widget.key 都同樣,那麼就會調用 didUpdateWidget()。
@override
void didUpdateWidget(MyStatefulApp oldWidget) {
super.didUpdateWidget(oldWidget);
print("didUpdateWidget");
}
// StaefulWidget 從樹中移除時
@override
void dispose() {
super.dispose();
print("dispose");
}
//執行 HotReload,就會觸發 reassemble(),這提供了從新初始化在 initState() 方法中準備的任何數據的機會,包括全局變量。
@override
void reassemble() {
super.reassemble();
print("reassemble");
}
}
複製代碼
在上面的例子中,除了效果外,咱們也看到了關於生命週期的備註信息。
// 控制檯日誌
// 1.第一次 | 新打開
....
Restarted application in 1,153ms.
flutter: initState
flutter: didChangeDependencies
flutter: reassemble
flutter: didUpdateWidget
...
// 2.咱們點擊⚡️按鈕熱重載
...
Syncing files to device iPhone Xʀ...
flutter: reassemble
flutter: didUpdateWidget
...
// 3. 移除 widget
...
flutter: reassemble
flutter: dispose
Reloaded 2 of 442 libraries in 117ms.
...
複製代碼
Widget 衆多,須要開發者們更多地實踐與性能的關注。 路漫漫其修遠兮,今天也要加油鴨~
快狗打車前端團隊專一前端技術分享,按期推送高質量文章,歡迎關注點贊。
文章同步發佈在公衆號喲,想要第一時間獲得最新的資訊,just scan it !