å å« Flutter 常ç¨çç»ä»¶ãå¸å±ãæ¹æ³çãåå¦è ç宿´å¿«éåè
宿´æç¨è¯·åé Flutter ä¸æç¤¾åºç å®è£ åç¯å¢é ç½®
$ sudo softwareupdate --install-rosetta --agree-to-license
å¨ Apple è¯çç Mac çµè ä¸ï¼è¿éè¦å®è£ Rosetta 2 ç¯å¢å 为 ä¸äºè¾ å©å·¥å · ä»ç¶éè¦ï¼éè¿æå¨è¿è¡ä¸é¢çå½ä»¤æ¥å®è£
å®è£ å æ¥è·åææ°ç stable Flutter SDKï¼
Apple è¯ç flutter_macos_arm64_3.22.2-stable.zip
æ³è¦è·åå°å ¶ä»çæ¬çå®è£ å ï¼è¯·åé SDK çæ¬å表 页é¢
å°æä»¶è§£åå°ç®æ è·¯å¾, æ¯å¦:
$ cd ~/development
$ unzip ~/Downloads/flutter_macos_3.22.2-stable.zip
é
ç½® flutter ç PATH ç¯å¢åéï¼
$ export PATH="$PATH:`pwd`/flutter/bin"
è¿è¡ flutter doctor å½ä»¤
宿´æç¨è¯·åé Flutter ä¸æç¤¾åºç å®è£ åç¯å¢é ç½®
flutter ç®å½æ´ä¸ªæ¾å¨ä½ æ³æ¾ç½® Flutter SDK çè·¯å¾ä¸ï¼ä¾å¦ C:\src\flutterï¼path ç¯å¢åéï¼å¨å¼å§èåçæç´¢åè½é®å
¥ãenvãï¼ç¶åéæ© ç¼è¾ç³»ç»ç¯å¢åéãå¨ ç¨æ·åé 䏿 ä¸ï¼æ£æ¥æ¯å¦æ Path è¿ä¸ªæ¡ç®ï¼
; åéå·²æçå
容ï¼å å
¥ flutter\bin ç®å½ç宿´è·¯å¾ãflutter\bin æå¨ç宿´è·¯å¾ä½ä¸ºæ°åéçå¼å¦æä½ 䏿³å®è£
æå®çæ¬çå®è£
å
ãå¯ä»¥å¿½ç¥æ¥éª¤ 1 å 2ãä» GitHub ä¸ç Flutter repo è·åæºä»£ç ï¼å¹¶æ ¹æ®éè¦ï¼åæ¢å°æå®çåæ¯ææ ç¾
C:\src>git clone https://github.com/flutter/flutter.git -b stable
Text("Hello world",
textAlign: TextAlign.left,
);
Text("Hello world! I'm Jack. "*4,
maxLines: 1,
overflow: TextOverflow.ellipsis,
);
Text("Hello world",
textScaleFactor: 1.5,
);
Text("Hello world",
style: TextStyle(
color: Colors.blue,
fontSize: 18.0,
height: 1.2,
fontFamily: "Courier",
background: Paint()..color=Colors.yellow,
decoration:TextDecoration.underline,
decorationStyle: TextDecorationStyle.dashed
),
);
Text.rich(TextSpan(
children: [
TextSpan(
text: "Home: "
),
TextSpan(
text: "https://flutter.dev",
style: TextStyle(
color: Colors.blue
),
recognizer: _tapRecognizer
),
]
))
DefaultTextStyle(
// 1.è®¾ç½®ææ¬é»è®¤æ ·å¼
style: TextStyle(
color:Colors.red,
fontSize: 20.0,
),
textAlign: TextAlign.start,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("hello world"),
Text("I am Jack"),
Text("I am Jack",
style: TextStyle(
inherit: false, //2.ä¸ç»§æ¿é»è®¤æ ·å¼
color: Colors.grey
),
),
],
),
);
å¨ asset ä¸å£°æï¼è¦å
å¨ pubspec.yaml ä¸å£°æå®
flutter:
fonts:
- family: Raleway
fonts:
- asset: assets/fonts/Raleway-Regular.ttf
- asset: assets/fonts/Raleway-Medium.ttf
weight: 500
- asset: assets/fonts/Raleway-SemiBold.ttf
weight: 600
- family: AbrilFatface
fonts:
- asset: assets/fonts/abrilfatface/AbrilFatface-Regular.ttf
å°å使件å¤å¶å°å¨ pubspec.yaml 䏿å®çä½ç½®
使ç¨åä½
// å£°æææ¬æ ·å¼
const textStyle = const TextStyle(
fontFamily: 'Raleway',
);
// ä½¿ç¨ææ¬æ ·å¼
var buttonText = const Text(
"Use the font for this text",
style: textStyle,
);
ElevatedButton(
child: Text("normal"),
onPressed: () {},
);
TextButton(
child: Text("normal"),
onPressed: () {},
)
OutlineButton(
child: Text("normal"),
onPressed: () {},
)
IconButton(
icon: Icon(Icons.thumb_up),
onPressed: () {},
)
ElevatedButton.icon(
icon: Icon(Icons.send),
label: Text("åé"),
onPressed: _onPressed,
),
OutlineButton.icon(
icon: Icon(Icons.add),
label: Text("æ·»å "),
onPressed: _onPressed,
),
TextButton.icon(
icon: Icon(Icons.info),
label: Text("详æ
"),
onPressed: _onPressed,
),
å¨å·¥ç¨æ ¹ç®å½ä¸å建ä¸ä¸ªimagesç®å½ï¼å¹¶å°å¾ç aaa.png æ·è´å°è¯¥ç®å½ã
å¨ pubspec.yaml ä¸ç flutter é¨åæ·»å å¦ä¸å
容ï¼
assets:
- images/aaa.png
注æ: ç±äº yaml æä»¶å¯¹ç¼©è¿ä¸¥æ ¼ï¼æä»¥å¿ é¡»ä¸¥æ ¼æç §æ¯ä¸å±ä¸¤ä¸ªç©ºæ ¼çæ¹å¼è¿è¡ç¼©è¿ï¼æ¤å¤ assets åé¢åºæä¸¤ä¸ªç©ºæ ¼ã
å 载该å¾ç
Image(
image: AssetImage("images/aaa.png"),
width: 100.0
);
Image 乿ä¾äºä¸ä¸ªå¿«æ·çæé 彿° Image.asset ç¨äºä» asset ä¸å è½½ãæ¾ç¤ºå¾çï¼
Image.asset("images/aaa.png",
width: 100.0,
)
Image(
image: NetworkImage(
"https://avatars2.githubusercontent.com/u/20411648?s=460&v=4"),
width: 100.0,
)
Image 乿ä¾äºä¸ä¸ªå¿«æ·çæé 彿° Image.network ç¨äºä»ç½ç»å è½½ãæ¾ç¤ºå¾çï¼
Image.network(
"https://avatars2.githubusercontent.com/u/20411648?s=460&v=4",
width: 100.0,
)
const Image({
...
this.width, // å¾çç宽
this.height, // å¾çé«åº¦
this.color, // å¾ççæ··åè²å¼
this.colorBlendMode, // æ··åæ¨¡å¼
this.fit,// ç¼©æ¾æ¨¡å¼
// 坹齿¹å¼
this.alignment = Alignment.center,
// é夿¹å¼
this.repeat = ImageRepeat.noRepeat,
...
})
Switch(
value: true,//å½åç¶æ
onChanged:(value){
// éæ°æå»ºé¡µé¢
},
),
Checkbox(
value: true,
// é䏿¶çé¢è²
activeColor: Colors.red,
onChanged:(value){
// ...
},
)
TextField(
autofocus: true,
onChanged: (v) {
print("onChange: $v");
}
)
模ç³è¿åº¦æ¡(伿§è¡ä¸ä¸ªå¨ç»)
LinearProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
),
è¿åº¦æ¡æ¾ç¤º 50%
LinearProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
value: .5,
)
模ç³è¿åº¦æ¡(伿§è¡ä¸ä¸ªæè½¬å¨ç»)
CircularProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
),
è¿åº¦æ¡æ¾ç¤º 50%ï¼ä¼æ¾ç¤ºä¸ä¸ªåå
CircularProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
value: .5,
),
线æ§è¿åº¦æ¡é«åº¦æå®ä¸º 3
SizedBox(
height: 3,
child: LinearProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
value: .5,
),
),
åå½¢è¿åº¦æ¡ç´å¾æå®ä¸º 100
SizedBox(
height: 100,
width: 100,
child: CircularProgressIndicator(
backgroundColor: Colors.grey[200],
valueColor: AlwaysStoppedAnimation(Colors.blue),
value: .7,
),
),
å¨å®é å¼åä¸ï¼Container常常ç¨äºå¯¹ä¸ä¸ªç»ä»¶è¿è¡å è£ ä¿®é¥°ã
Container(
width: 100,
height: 100,
color: Colors.blue,
alignment: Alignment.center,
child: Text('Hello world'),
),
å° Contianer 大å°åºå®ä¸º 100 * 100ï¼ èæ¯è²ä¸ºèè²ãæ Text å
è£¹å¨ Container ä¸ï¼å¹¶å°å
¶å±
ä¸
åå¸å±(Column),å¯ä»¥å°å¤ä¸ªåç»ä»¶æ²¿çåç´çæ¹åææ¾(ç«çææ¾)
// å°container å button ææ¾å°åä¸åã
Column(
children: [
Container(
width: 100,
height: 100,
color: Colors.blue,
alignment: Alignment.center,
child: Text('Hello world'),
),
ElevatedButton(
onPressed: () {},
child: Text('Button'),
),
],
),
è¡å¸å±(Row)ï¼å¯ä»¥å°å¤ä¸ªç»ä»¶æ²¿æ°´å¹³çæ¹åææ¾ã
Row(
children: [
ElevatedButton(
onPressed: () {},
child: const Text('1'),
),
ElevatedButton(
onPressed: () {},
child: const Text('2'),
),
ElevatedButton(
onPressed: () {},
child: const Text('3'),
),
],
),
å¨åä¸è¡ææ¾ 3 个 Button
å°åç»ä»¶ä»å·¦å°å³ä¾æ¬¡æåï¼å½ç©ºé´ä¸è¶³æ¶èªå¨æ¢è¡ã
Wrap(
children: [
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
],
),
æ¾ç¤ºå¤ä¸ª Flutter ç logo å¹¶èªå¨æ¢è¡
Stack å¯ä»¥å°ä¸å¤ä¸ªåç»ä»¶å å¨ä¸èµ·æ¾ç¤ºãå å é¡ºåºæç
§children屿§ä¸çåè¡¨ä¾æ¬¡å å ææ¾ï¼é»è®¤å°åæ§ä»¶æ²¿å·¦ä¸è§å¯¹é½ã
éè¦æ§å¶åæ§ä»¶ä½ç½®å¯ä»¥åµå¥Positonedæ§ä»¶ã
Stack(
children: [
Container(
height: 300,
width: 300,
color: Colors.blue,
),
Container(
height: 200,
width: 200,
color: Colors.black,
),
Container(
height: 100,
width: 100,
color: Colors.yellow,
),
],
),
便¬¡å å 300*300 çèè²è²åã200*200 çé»è²è²åã100*100 çé»è²è²å
è¥éè¦æ§å¶Stackä¸åæ§ä»¶çä½ç½®ï¼åå¯ä»¥åµå¥æ¹æ§ä»¶ã
Stack(
children: [
// é»è®¤ææ¾å¨å·¦ä¸ä½ç½®
Container(
height: 300,
width: 300,
color: Colors.blue,
),
// è·ç¦»å·¦è¾¹40个ãè·ç¦»ä¸é¢40个é»è¾åç´ çä½ç½®
Positioned(
left: 40,
top: 40,
child: Container(
height: 200,
width: 200,
color: Colors.black,
),
),
// è·ç¦»å·¦è¾¹80个ãè·ç¦»ä¸é¢80个é»è¾åç´ çä½ç½®
Positioned(
left: 80,
top: 80,
child: Container(
height: 100,
width: 100,
color: Colors.yellow,
),
),
],
),
Alignç»ä»¶ç¨äºå³å®åç»ä»¶å¯¹é½æ¹å¼
// 使ç¨Alignå°Button å±
ä¸å¨Containerä¸
Container(
width: 100,
height: 100,
color: Colors.green,
child: Align(
alignment: Alignment.center,
child: ElevatedButton(
onPressed: () {},
child: Text('Center'),
),
),
),
Center ç»ä»¶å®é ä¸ç»§æ¿äºAlignãç¨äºä¸é¨å± ä¸ã
//ä¸ Alignä¸ä»£ç ææä¸è´
Container(
width: 100,
height: 100,
color: Colors.green,
child: Center(
child: ElevatedButton(
onPressed: () {},
child: Text('Center'),
),
),
),
Flex çç¨æ³ä¸ Row æ Column 类似ï¼ä½åªéè¦é¢å¤ä¼ å
¥ direction åæ°
Row å Column ç»ä»¶é½ç»§æ¿ Flex ç»ä»¶direction 为 Axis.horizontal 表示水平æ¹å(Row)ï¼ä¸º Axis.verticalå为åç´æ¹å(Column)åç´æ¹å便¬¡ææ¾3个flutter logo
Flex(
direction: Axis.vertiacl,
children: [
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
],
),
æ°´å¹³æ¹å便¬¡ææ¾ 3 个 flutter logo
Flex(
direction: Axis.horizontal,
children: [
FlutterLogo(),
FlutterLogo(),
FlutterLogo(),
],
),
Expanded ç¨äºæ©å¼ ä¸ä¸ªåç»ä»¶ãå¯ä»¥éè¿ flex 屿§ï¼ç¨äºè¡¨ç¤ºè¯¥ç»ä»¶ç¸å¯¹å
¶ä»å¼¹æ§ç»ä»¶æ¾å¤§çåæ°(å¯ä»¥ç解为ä¸ä¸ªæé)ã
// Container ä¼å 满å©ä½çå
¨é¨ç©ºç¨ç©ºé´
Row(
children: [
FlutterLogo(),
Expanded(
child: Container(
child: FlutterLogo(),
color: Colors.green,
),
),
FlutterLogo(),
],
),
// æç
§1:2 çæ¯ä¾åé
䏿´è¡ç空é´
Row(
children: [
Expanded(
flex: 1,
child: Container(
child: FlutterLogo(),
color: Colors.green,
),
),
Expanded(
flex: 2,
child: Container(
child: FlutterLogo(),
color: Colors.blue,
),
),
],
),
Flexible æ¯ Expanded ç»ä»¶çç¶ç±»ã
ä¸ Expanded ä¸åçæ¯ï¼Flexible å¯ä»¥éè¿ fit 屿§è®¾ç½®åæ§ä»¶æ¯å¦å¿
é¡»å æ»¡ Flexibal æ©å±ç空é´ãè Expaned é»è®¤åæ§ä»¶å¿
é¡»å æ»¡
// 妿å°fit设置为tightï¼
// å绿è²Container åèè²Container大å°ä¸æ ·ã
// 妿å°fit设置为looseï¼
// å两个Flexibleæ©å±ç空é´å¤§å°æ¯ä¸æ ·çï¼
// ä½ç»¿è²Containerå¹¶ä¸ä¼å¡«å
æ´ä¸ªæ©å±ç空é´ã
Row(
children: [
Flexible(
flex: 2,
// fit: FlexFit.tight,
child: Container(
child: FlutterLogo(),
color: Colors.green,
),
),
Expanded(
flex: 2,
child: Container(
child: FlutterLogo(),
color: Colors.blue,
),
),
],
),
å° Flexible ç fit 屿§è®¾ç½®ä¸º tingtï¼å°±çä»·äºä½¿ç¨ Expanded
Spacer ç¨äºå¨å¸å±ä¸çç½
Row(
children: [
Text('Item'),
Spacer(),
FlutterLogo(),
],
),
ä¾å¦ï¼éè¦ææ¬å徿 ä½äºä¸ä¸ªè¡ç两端ï¼èä¸é´çç½æ¶ãå°±å¯ä»¥ä½¿ç¨ Spacer
ListView æ¯ä¸ä¸ªæ¯ææ»å¨çå表ç»ä»¶ã该ç»ä»¶é»è®¤æ¯æä¸ä¸æ»å¨ã
ListViewçé»è®¤æé 彿°ï¼ä¼ç«å³åå§åchildrenä¸çææåwidgetï¼æ æ³å¨æå è½½ã
ListView(
children: [
Text('1'),
Text('2'),
Text('3'),
Text('4'),
],
),
éè¦å¨æå è½½ï¼åå¯ä»¥ä½¿ç¨ ListView.builder()å½åæå½æ°ã
// 卿çæ4个Text
ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Text('$index');
},
itemCount: 4,
),
éè¦å¨å¯¹ListViewä¸çItemæ·»å åå²çº¿ï¼åå¯ä»¥åå©ListView.separated()ã
// separatorBuilder 彿°ç¨äºå¨å
ç´ ä¹é´æå
¥åå²çº¿ã
// ä¹å¯ä»¥è¿åå
¶ä»widgetã该widgetä¼è¢«æå
¥å个å
ç´ ä¹é´ã
ListView.separated(
itemBuilder: (BuildContext context, int index) {
return Text('$index');
},
itemCount: 4,
separatorBuilder: (BuildContext context, int index) {
// 使ç¨Divider widget ç»ä¸æ¡ç²ä¸º5ï¼é¢è²ä¸ºçº¢è²ç线
return const Divider(
height: 5,
thickness: 5,
color: Colors.red,
);
},
),
GridViewå¯å°å
ç´ æ¾ç¤ºä¸ºäºç»´ç½æ ¼ç¶çå表ç»ä»¶ï¼å¹¶æ¯æä¸»è½´æ¹åæ»å¨ã
使ç¨GridView() æé 彿°ï¼éè¦ä¼ å
¥gridDelegateåchildrenãFlutterä¸å·²ç»æä¾äºä¸¤ç§å®ç°æ¹å¼ï¼å嫿¯:
SliverGridDelegateWithFixedCrossAxisCount() ç¨äºäº¤åè½´æ¹ååºå®æ°ãSliverGridDelegateWithMaxCrossAxisExtent() ç¨äºäº¤åè½´æ¹åé嶿大é¿åº¦ã// 使ç¨SliverGridDelegateWithFixedCrossAxisCount
GridView(
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
children: List.generate(
8,
(index) => Container(
color: Colors.red[index % 8 * 100],
child: Text("index $index"),
)),
),
// 使ç¨SliverGridDelegateWithMaxCrossAxisExtent
GridView(
gridDelegate:
SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 200),
children: List.generate(
8,
(index) => Container(
color: Colors.red[index % 8 * 100],
child: Text("index $index"),
),
),
),
GridView.builder()å½åæé å¯ä»¥å®ç°å
ç´ ç卿å è½½ï¼ä¸ListView.builder()类似
GridView.builder(
itemCount: 8,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4),
itemBuilder: (context, index) => Container(
color: Colors.red[index % 8 * 100],
child: Text("index $index"),
),
),
Gridview.count() ä¸ä¸ªç®åçæé 彿°ï¼åªéè¦ä¼ å
¥crossAxisCountï¼äº¤åè½´å
ç´ ç个æ°ï¼åchildrenå³å¯ã
GridView.count(
crossAxisCount: 4, // æ¯è¡åºå®ä¸º4个
children: List.generate(
8,
(index) => Container(
color: Colors.red[index % 8 * 100],
child: Text("index $index"),
)),
),
GridView.extent() ç¨äºè®¾å®æ¯ä¸ªå
ç´ å¨äº¤åè½´æ¹åçæå¤§å°ºå¯¸ãå½ç¨åºè¿è¡å¨è¾å¤§å±å¹æ¶é常è½çå°æ´å¤çå
ç´ ï¼è䏿¯å°éå
ç´ çæ¾å¤§çãéè¿ä¼ å
¥maxCrossAxisExtent,Gridview伿 ¹æ®å±å¹å°ºå¯¸èªå¨éæ©åéçè¡æ°éã
GridView.extent(
maxCrossAxisExtent: 200,
children: List.generate(
8,
(index) => Container(
color: Colors.red[index % 8 * 100],
child: Text("index $index"),
)),
),
GridView.count()åGridView.extent()`å¯ä»¥çä½GridViewçè¯æ³ç³ã
使ç¨PageViewå¯ä»¥å®ç°æ´å±é¡µé¢æ»å¨,é»è®¤ä¸ºæ°´å¹³æ¹å翻页ãä¸ListView类似ã
pageSnappingåæ°å¯ä»¥è®¾ç½®æ»å¨æ¶Pageåçå¨ä»»æä½ç½®ãscrollDirectionåæ°è®¾ç½®æ»å¨æ¹å(é»è®¤ä¸ºæ°´å¹³æ¹å)ãPageView(
pageSnapping: false, // 忶页é¢åºå®
scrollDirection: Axis.vertical, // 设置为åç´æ¹åæ»å¨
children: [
for (int i = 0; i < 4; i++)
Container(
color: Colors.red[i % 4 * 100],
)
],
),
使ç¨PageView.builder()å½åæé ï¼å¯ä»¥å¨æå 载页é¢ãä¸ListView.builder()类似ã
PageView.builder(
pageSnapping: false,
scrollDirection: Axis.vertical,
itemBuilder: (BuildContext context, int index) => Container(
color: Colors.red[index % 4 * 100],
),
),
å¨å¨ç»ç»ä»¶å ï¼ç´æ¥é ç½®curveåduration屿§
使ç¨AnimatedContainerç»ä»¶ï¼é ç½®curveæ²çº¿è¿æ¸¡ådurationè¿æ¸¡æ¶é´
class HomeState extends StatefulWidget{
const HomeState({Key? key}) : super(key:key);
State<HomeState> createState()=>_HomeState();
}
class _HomeState extends State<HomeState>{
bool press = false; //设置å¨ç»è§¦åçæ¡ä»¶
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
setState(() {
press = true; //ç¹å»FloatingActionButtonè¿è¡å¨ç»ææ
});
}
,child: const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: AnimatedContainer(
curve: Curves.ease, //æ²çº¿
duration: const Duration(seconds: 1), //å»¶æ¶
width: press ? 200 : 300,
height: 200,
color:Colors.yellow,
transform: press ? Matrix4.translationValues(0, 0, 0) :
Matrix4.translationValues(100, 100, 0)
),
)
)
);
}
}
éè¿é ç½®paddingå¼çæ¹åï¼å¼èµ·ç»ä»¶çç§»å¨å¨ç»ææ,åæ ·æ¯æcurveådurationçé ç½®
class _HomeState extends State<HomeState>{
bool press = false;
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
setState(() {
press = true;
});
}
,child: const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: AnimatedPadding(
padding: EdgeInsets.fromLTRB(10, press ? 10 : 400, 0, 0), //é
置边è·å¼
curve: Curves.ease, //æ²çº¿
duration: const Duration(seconds: 1), //å»¶æ¶
child: Container(
width: 200,
height: 200,
color:Colors.yellow,
),
),
)
)
);
}
}
éè¿é ç½®alignmentå¼çæ¹åï¼å¼èµ·ç»ä»¶ç对é½å¨ç»ææ,åæ ·æ¯æcurveådurationçé ç½®
class _HomeState extends State<HomeState>{
bool press = false;
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
setState(() {
press = true;
});
}
,child: const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: AnimatedAlign(
alignment: press ? Alignment.center : Alignment.topCenter,
curve: Curves.ease, //æ²çº¿
duration: const Duration(seconds: 1), //å»¶æ¶
child: Container(
width: 200,
height: 200,
color:Colors.yellow,
),
),
)
)
);
}
}
éè¿é ç½®opacityå¼çæ¹åï¼å¼èµ·ç»ä»¶çéæåº¦ååå¨ç»ææ,åæ ·æ¯æcurveådurationçé ç½®
class _HomeState extends State<HomeState>{
bool press = false;
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
setState(() {
press = true;
});
}
,child: const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: AnimatedOpacity(
opacity: press ? 1 : 0.1,
curve: Curves.ease, //æ²çº¿
duration: const Duration(seconds: 1), //å»¶æ¶
child: Container(
width: 200,
height: 200,
color:Colors.yellow,
),
),
)
)
);
}
}
éè¿é ç½®top,left,right,bottomå¼çæ¹åï¼å¼èµ·ç»ä»¶çè·ç¦»ååå¨ç»ææ,åæ ·æ¯æcurveådurationçé ç½®
class _HomeState extends State<HomeState>{
bool press = false;
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
setState(() {
press = true;
});
}
,child: const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body:Stack(
children: [
AnimatedPositioned(
top: press ? 0 : 100,
left:press ? 0 : 100,
curve: Curves.ease, //æ²çº¿
duration: const Duration(seconds: 1), //å»¶æ¶
child: Container(
width: 200,
height: 200,
color:Colors.yellow,
),
),
],
)
)
);
}
}
ä½¿ç¨æ¾ç¤ºå¨ç»æ¶ï¼å®ä¹ AnimationControllerï¼å¹¶å¨ç»ä»¶ä¸ä½¿ç¨ SingleTickerProviderStateMixinã
RotationTransition å®ç°æè½¬å¨ç»ï¼turns 为 AnimationControllerãå¨ initState ä¸è®¾ç½® vsync å durationï¼ä½¿ç¨ ..repeat() å®ç°å¨ç»å¾ªç¯ã
class _Boxed extends State<Boxed> with SingleTickerProviderStateMixin{
late AnimationController _controller;
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(seconds: 1)
)..repeat(); // 让ç¨åºåææºçå·æ°é¢çç»ä¸
}
Widget build(BuildContext context) {
return SizedBox(
height: 100,
width: 100,
child: RotationTransition(turns: _controller,
child: const FlutterLogo(size: 60),
)
);
}
}
class _HomeState extends State<HomeState> with SingleTickerProviderStateMixin {
late AnimationController _controller;
void initState() {
super.initState();
// 让ç¨åºåææºçå·æ°é¢çç»ä¸
_controller = AnimationController(vsync: this, duration: const Duration(seconds: 1));
}
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: () {
_controller.repeat(); //é夿æ¾
},child:const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: Column(
children: [
RotationTransition(
turns: _controller,
child: const FlutterLogo(size: 60),
),
ElevatedButton(onPressed: (){
_controller.forward(); // ð ææ¾ä¸æ¬¡
}, child:const Icon(Icons.refresh)),
ElevatedButton(onPressed: (){
_controller.reverse(); // ð ååºææ¾
}, child:const Icon(Icons.refresh)),
ElevatedButton(onPressed: (){
_controller.stop(); // ð 忢
}, child:const Icon(Icons.refresh)),
ElevatedButton(onPressed: (){
_controller.reset(); // ð éç½®
}, child:const Icon(Icons.refresh)),
]
)
)
)
);
}
}
FadeTransition å®ç°éæåº¦ååï¼opacity 为 AnimationControllerãå¯ä»¥éè¿ reverse() å®ç°ä»å®ä½éæ¸åéæã
class _HomeState extends State<HomeState> with SingleTickerProviderStateMixin {
late AnimationController _controller;
void initState() {
super.initState();
//让ç¨åºåææºçå·æ°é¢çç»ä¸
_controller = AnimationController(vsync: this, duration: const Duration(seconds: 1));
}
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
_controller.repeat(); //é夿æ¾
},child:const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: FadeTransition(opacity: _controller,
child: const FlutterLogo(size: 60,),
)
)
)
);
}
}
ä¹å¯ä»¥éè¿ lowerBound å upperBound æ¥é ç½® controller çæä½åæé«å¼
ScaleTransition å®ç°ç¼©æ¾å¨ç»ï¼scale 为 AnimationControllerï¼å¯ä»¥éè¿ reverse() å®ç°ä»å¤§å°å°çå¨ç»ææã
class _HomeState extends State<HomeState> with SingleTickerProviderStateMixin {
late AnimationController _controller;
void initState() {
super.initState();
// 让ç¨åºåææºçå·æ°é¢çç»ä¸
_controller = AnimationController(vsync: this, duration: const Duration(seconds: 1));
}
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
floatingActionButton:FloatingActionButton(onPressed: (){
_controller.repeat(); //é夿æ¾
},child:const Icon(Icons.add),) ,
appBar: AppBar(
title: const Text("æµè¯"),
),
body: Center(
child: ScaleTransition(scale: _controller,
child: const FlutterLogo(size: 60,),
)
)
)
);
}
}