為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2018-12 文章編輯:小燈 瀏覽次數(shù):2801
創(chuàng)建的flutter項(xiàng)目中,看一下這些部分是怎么組織起來的
在這個(gè)示例中,主要Dart代碼是在 lib/main.dart 文件中,下面我們看看該示例的源碼:
import 'package:flutter/material.dart';// 應(yīng)用入口 void main() => runApp(MyApp());class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( // 藍(lán)色主題primarySwatch: Colors.blue, ), // 應(yīng)用首頁路由 home: MyHomePage(title: 'Flutter Demo Home Page'), ); } }class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key);final String title;@override _MyHomePageState createState() => _MyHomePageState(); }class _MyHomePageState extends State<MyHomePage> { int _counter = 0;void _incrementCounter() { setState(() { _counter++; }); }@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center(child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } }
1、導(dǎo)入包
import 'package:flutter/material.dart';
此行代碼作用是導(dǎo)入了Material UI組件庫。Material是一種標(biāo)準(zhǔn)的移動(dòng)端和web端的視覺設(shè)計(jì)語言, Flutter默認(rèn)提供了一套豐富的Material風(fēng)格的UI組件。
2、應(yīng)用入口
void main() => runApp(new MyApp());
3、應(yīng)用結(jié)構(gòu)
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( //應(yīng)用名稱 title: 'Flutter Demo',theme: new ThemeData( //藍(lán)色主題 primarySwatch: Colors.blue, ), //應(yīng)用首頁路由 home: new MyHomePage(title: 'Flutter Demo Home Page'), ); } }
4、首頁
class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); }class _MyHomePageState extends State<MyHomePage> {... }
MyHomePage 是應(yīng)用的首頁,它繼承自StatefulWidget類,表示它是一個(gè)有狀態(tài)的widget(Stateful widget)?,F(xiàn)在,我們可以簡單認(rèn)為Stateful widget 和Stateless widget有兩點(diǎn)不同:
_MyHomePageState類是MyHomePage類對應(yīng)的狀態(tài)類??吹竭@里,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),和MyApp 類不同, MyHomePage類中并沒有build方法,取而代之的是,build方法被挪到了_MyHomePageState方法中,至于為什么這么做,先留個(gè)疑問,在分析完完整代碼后再來解答。
接下來,我們看看_MyHomePageState中都包含哪些東西:
(1)狀態(tài)。
int _counter = 0;
_counter 為保存屏幕右下角帶“?”號(hào)按鈕點(diǎn)擊次數(shù)的狀態(tài)。
(2)設(shè)置狀態(tài)的自增函數(shù)。
void _incrementCounter() { setState(() {_counter++; }); }
當(dāng)按鈕點(diǎn)擊時(shí),會(huì)調(diào)用此函數(shù),該函數(shù)的作用是先自增_counter,然后調(diào)用setState 方法。setState方法的作用是通知Flutter框架,有狀態(tài)發(fā)生了改變,F(xiàn)lutter框架收到通知后,會(huì)執(zhí)行build方法來根據(jù)新的狀態(tài)重新構(gòu)建界面, Flutter 對此方法做了優(yōu)化,使重新執(zhí)行變的很快,所以你可以重新構(gòu)建任何需要更新的東西,而無需分別去修改各個(gè)widget。
(3)構(gòu)建UI界面
構(gòu)建UI界面的邏輯在build方法中,當(dāng)MyHomePage第一次創(chuàng)建時(shí),_MyHomePageState類會(huì)被創(chuàng)建,當(dāng)初始化完成后,F(xiàn)lutter框架會(huì)調(diào)用Widget的build方法來構(gòu)建widget樹,最終將widget樹渲染到設(shè)備屏幕上。所以,我們看看_MyHomePageState的build方法中都干了什么事:
Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: new Center( 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), ), ); }
現(xiàn)在,我們將整個(gè)流程串起來:當(dāng)右下角的floatingActionButton按鈕被點(diǎn)擊之后,會(huì)調(diào)用_incrementCounter,在_incrementCounter中,首先會(huì)自增_counter計(jì)數(shù)器(狀態(tài)),然后setState會(huì)通知Flutter框架狀態(tài)發(fā)生變化,接著,F(xiàn)lutter會(huì)調(diào)用build方法以新的狀態(tài)重新構(gòu)建UI,最終顯示在設(shè)備屏幕上。
為什么要將build方法放在State中,而不是放在StatefulWidget中?
這主要是為了開發(fā)的靈活性。如果將build()方法在StatefulWidget中則會(huì)有兩個(gè)問題:
試想一下,如果我們的Stateful widget 有很多狀態(tài),而每次狀態(tài)改變都要調(diào)用build方法,由于狀態(tài)是保存在State中的,如果將build方法放在StatefulWidget中,那么構(gòu)建時(shí)讀取狀態(tài)將會(huì)很不方便,如果真的將build方法放在StatefulWidget中的話,由于構(gòu)建用戶界面過程需要依賴State,所以build方法將必須加一個(gè)State參數(shù),大概是下面這樣:
Widget build(BuildContext context, State state){ //state.counter ... }
這樣的話就只能將State的所有狀態(tài)聲明為公開的狀態(tài),這樣才能在State類外部訪問狀態(tài),但將狀態(tài)設(shè)置為公開后,狀態(tài)將不再具有私密性,這樣依賴,對狀態(tài)的修改將會(huì)變的不可控。將build()方法放在State中的話,構(gòu)建過程則可以直接訪問狀態(tài),這樣會(huì)很方便。
例如,F(xiàn)lutter中有一個(gè)動(dòng)畫widget的基類AnimatedWidget,它繼承自StatefulWidget類。AnimatedWidget中引入了一個(gè)抽象方法build(BuildContext context),繼承自AnimatedWidget的動(dòng)畫widget都要實(shí)現(xiàn)這個(gè)build方法?,F(xiàn)在設(shè)想一下,如果StatefulWidget 類中已經(jīng)有了一個(gè)build方法,正如上面所述,此時(shí)build方法需要接收一個(gè)state對象,這就意味著AnimatedWidget必須將自己的State對象(記為_animatedWidgetState)提供給其子類,因?yàn)樽宇愋枰谄鋌uild方法中調(diào)用父類的build方法,代碼可能如下:
class MyAnimationWidget extends AnimatedWidget{ @override Widget build(BuildContext context, State state){ //由于子類要用到AnimatedWidget的狀態(tài)對象_animatedWidgetState, //所以AnimatedWidget必須通過某種方式將其狀態(tài)對象_animatedWidgetState //暴露給其子類super.build(context, _animatedWidgetState) } }
這樣很顯然是不合理的,因?yàn)?/p>
綜上所述,可以發(fā)現(xiàn),對于StatefulWidget,將build方法放在State中,可以給開發(fā)帶來很大的靈活性。
日期:2018-10 瀏覽次數(shù):7274
日期:2018-12 瀏覽次數(shù):4345
日期:2018-07 瀏覽次數(shù):4891
日期:2018-12 瀏覽次數(shù):4187
日期:2018-09 瀏覽次數(shù):5516
日期:2018-12 瀏覽次數(shù):9938
日期:2018-11 瀏覽次數(shù):4823
日期:2018-07 瀏覽次數(shù):4595
日期:2018-05 瀏覽次數(shù):4870
日期:2018-12 瀏覽次數(shù):4337
日期:2018-10 瀏覽次數(shù):5153
日期:2018-12 瀏覽次數(shù):6229
日期:2018-11 瀏覽次數(shù):4482
日期:2018-08 瀏覽次數(shù):4602
日期:2018-11 瀏覽次數(shù):12654
日期:2018-09 瀏覽次數(shù):5595
日期:2018-12 瀏覽次數(shù):4848
日期:2018-10 瀏覽次數(shù):4202
日期:2018-11 瀏覽次數(shù):4541
日期:2018-12 瀏覽次數(shù):6077
日期:2018-06 瀏覽次數(shù):4018
日期:2018-08 瀏覽次數(shù):5452
日期:2018-10 瀏覽次數(shù):4466
日期:2018-12 瀏覽次數(shù):4547
日期:2018-07 瀏覽次數(shù):4372
日期:2018-12 瀏覽次數(shù):4513
日期:2018-06 瀏覽次數(shù):4401
日期:2018-11 瀏覽次數(shù):4387
日期:2018-12 瀏覽次數(shù):4262
日期:2018-12 瀏覽次數(shù):5297
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.