Flutter Widget移動(dòng)UI框架使用Material和密匙Key實(shí)戰(zhàn)
Flutter
Flutter是谷歌的移動(dòng)UI框架,可以在IOS和Android上快速構(gòu)建高質(zhì)量的本地用戶(hù)界面。Flutter可以使用現(xiàn)有代碼。
在世界上,F(xiàn)lutter正被越來(lái)越多的開(kāi)發(fā)人員和組織使用,F(xiàn)lutter是完全免費(fèi)和開(kāi)源的。這也是構(gòu)建未來(lái)Google Fuchsia應(yīng)用程序的主要方式。
import 'package:flutter/material.dart'; void main() { runApp( new Center( child: new Text( 'Hello, world!', textDirection: TextDirection.ltr, ), ), ); }
runApp函數(shù)接受給定的小部件,并使其成為小部件樹(shù)的根。在本例中,小部件樹(shù)由兩個(gè)小部件組成:Center(及其子小部件)和Text。框架強(qiáng)制根小部件覆蓋整個(gè)屏幕,這意味著文本“Hello,world”將位于屏幕中心。需要在text實(shí)例中指定文本顯示的方向。使用MaterialApp時(shí),將自動(dòng)設(shè)置文本方向,稍后將進(jìn)行演示。 編寫(xiě)應(yīng)用程序時(shí),通常會(huì)創(chuàng)建新的小部件。這些小部件是無(wú)狀態(tài)無(wú)狀態(tài)小部件或有狀態(tài)有狀態(tài)小部件。具體選擇取決于小部件是否需要管理某些狀態(tài)。小部件的主要工作是實(shí)現(xiàn)一個(gè)構(gòu)建函數(shù)來(lái)構(gòu)建自己。小部件通常由一些較低級(jí)別的小部件組成。Flutter框架將依次構(gòu)建這些小部件,直到構(gòu)建最低級(jí)別的子小部件。這些最低級(jí)別的小部件通常是RenderObject,它將計(jì)算和描述小部件的幾何結(jié)構(gòu)。
Material
Flutter提供了許多小部件來(lái)幫助構(gòu)建遵循Material Design的應(yīng)用程序。Material應(yīng)用程序從MaterialApp小部件開(kāi)始,它在應(yīng)用程序的根位置創(chuàng)建一些有用的小部件,包括一個(gè)Navigator,它管理由字符串標(biāo)識(shí)的小部件堆棧(即頁(yè)面路由堆棧)。導(dǎo)航器允許應(yīng)用程序在頁(yè)面之間平滑過(guò)渡。是否使用MaterialApp是完全可選的,但使用它是一個(gè)很好的做法。 Scaffold是Material中主要的布局組件.
import 'package:flutter/material.dart'; void main() { runApp(new MaterialApp( title: 'Flutter Tutorial', home: new TutorialHome(), )); } class TutorialHome extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( leading: new IconButton( icon: new Icon(Icons.menu), tooltip: 'Navigation menu', onPressed: null, ), title: new Text('Example title'), actions: <Widget>[ new IconButton( icon: new Icon(Icons.search), tooltip: 'Search', onPressed: null, ), ], ), body: new Center( child: new Text('Hello, world!'), ), floatingActionButton: new FloatingActionButton( tooltip: 'Add', // used by assistive technologies child: new Icon(Icons.add), onPressed: null, ), ); } }
更完整的示例
讓我們考慮一個(gè)更完整的示例,它將上面介紹的概念結(jié)合在一起。讓我們假設(shè)一個(gè)顯示各種待售產(chǎn)品并維護(hù)購(gòu)物車(chē)的購(gòu)物應(yīng)用程序。讓我們先定義ShoppingListItem:
class Product { const Product({this.name}); final String name; } typedef void CartChangedCallback(Product product, bool inCart); class ShoppingListItem extends StatelessWidget { ShoppingListItem({Product product, this.inCart, this.onCartChanged}) : product = product, super(key: new ObjectKey(product)); final Product product; final bool inCart; final CartChangedCallback onCartChanged; Color _getColor(BuildContext context) { return inCart ? Colors.black54 : Theme.of(context).primaryColor; } TextStyle _getTextStyle(BuildContext context) { if (!inCart) return null; return new TextStyle( color: Colors.black54, decoration: TextDecoration.lineThrough, ); } @override Widget build(BuildContext context) { return new ListTile( onTap: () { onCartChanged(product, !inCart); }, leading: new CircleAvatar( backgroundColor: _getColor(context), child: new Text(product.name[0]), ), title: new Text(product.name, style: _getTextStyle(context)), ); } }
ShoppingListItem小部件是無(wú)狀態(tài)的。它將在構(gòu)造函數(shù)中接收的值存儲(chǔ)在最終成員變量中,然后在構(gòu)建函數(shù)中使用它們。例如,inCart布爾值表示在兩種視覺(jué)呈現(xiàn)效果之間切換:一種使用當(dāng)前主題的主色,另一種使用灰色。 當(dāng)用戶(hù)單擊列表項(xiàng)時(shí),小部件不會(huì)直接修改其inCart值。相反,小部件將調(diào)用其父小部件賦予它的onCartChanged回調(diào)函數(shù)。此模式允許在小部件層次結(jié)構(gòu)中存儲(chǔ)更高的狀態(tài),從而使?fàn)顟B(tài)持續(xù)更長(zhǎng)時(shí)間。在極端情況下,存儲(chǔ)并傳遞給runApp應(yīng)用程序的小部件的狀態(tài)將持續(xù)整個(gè)生命周期。 當(dāng)父項(xiàng)收到onCartChanged回調(diào)時(shí),父項(xiàng)將更新其內(nèi)部狀態(tài),這將觸發(fā)父項(xiàng)使用新的inCart值重新生成ShoppingListItem的新實(shí)例。盡管父ShoppingListItem在重建時(shí)創(chuàng)建了一個(gè)新實(shí)例,但操作成本很低,因?yàn)镕lutter框架會(huì)將新構(gòu)建的小部件與先前構(gòu)建的小組件進(jìn)行比較,并且只將差異應(yīng)用于底層RenderObject。
Key
可以使用該鍵控制在重新構(gòu)建小部件時(shí)框架將匹配哪些其他小部件。默認(rèn)情況下,框架根據(jù)其runtimeType和顯示順序進(jìn)行匹配。當(dāng)使用鍵時(shí),框架要求兩個(gè)小部件具有相同的鍵和runtimeType。 鍵對(duì)于構(gòu)建相同類(lèi)型的小部件的多個(gè)實(shí)例非常有用。例如,ShoppingList構(gòu)建了足夠的ShoppingListItem實(shí)例來(lái)填充其可見(jiàn)區(qū)域: 如果沒(méi)有密鑰,則當(dāng)前生成中的第一個(gè)項(xiàng)將始終與上一個(gè)生成中的首個(gè)項(xiàng)同步。即使在語(yǔ)義上,如果列表中的第一個(gè)項(xiàng)目滾動(dòng)到屏幕外,它在窗口中也不再可見(jiàn)。 通過(guò)將列表中的每個(gè)項(xiàng)目指定為“語(yǔ)義”鍵,無(wú)限列表可以更有效,因?yàn)榭蚣軐⑹鬼?xiàng)目與匹配的語(yǔ)義鍵同步,從而具有相似(或相同)的視覺(jué)外觀。此外,語(yǔ)義同步條目意味著在有狀態(tài)的子窗口小部件中,保留狀態(tài)將附加到相同的語(yǔ)義條目,而不是附加到相同編號(hào)位置的條目。
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { Widget titleSection = new Container( padding: const EdgeInsets.all(32.0), child: new Row( children: [ new Expanded( child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Container( padding: const EdgeInsets.only(bottom: 8.0), child: new Text( 'Oeschinen Lake Campground', style: new TextStyle( fontWeight: FontWeight.bold, ), ), ), new Text( 'Kandersteg, Switzerland', style: new TextStyle( color: Colors.grey[500], ), ), ], ), ), new Icon( Icons.star, color: Colors.red[500], ), new Text('41'), ], ), ); //... }
將第一行文本放入容器,然后在底部添加8個(gè)像素。列中的第二個(gè)子項(xiàng)(也是文本)顯示為灰色。 標(biāo)題行中的最后兩項(xiàng)是紅星圖標(biāo)和文本“41”。將整行放在容器中,沿每條邊填充32個(gè)像素
以上就是Flutter Widget移動(dòng)UI框架使用Material和密匙Key實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Flutter Widget移動(dòng)UI Material的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Android?獲取實(shí)時(shí)網(wǎng)速實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Windows下Flutter+Idea環(huán)境搭建及配置
這篇文章介紹了Windows下Flutter+Idea環(huán)境搭建及配置的方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Android 使用FragmentTabhost代替Tabhost
這篇文章主要介紹了Android 使用FragmentTabhost代替Tabhost的相關(guān)資料,需要的朋友可以參考下2017-05-05IOS開(kāi)發(fā)向右滑動(dòng)返回前一個(gè)頁(yè)面功能(demo)
本文給大家介紹使用android實(shí)現(xiàn)向右滑動(dòng)返回一個(gè)頁(yè)面的功能,大家都知道在ios7中,蘋(píng)果的原生態(tài)應(yīng)用幾乎都能夠通過(guò)向右滑動(dòng)來(lái)返回到前一個(gè)頁(yè)面,這樣可以避免用戶(hù)在單手操作時(shí)用大拇指去點(diǎn)擊那個(gè)遙遠(yuǎn)的返回鍵,下面小編就給帶來(lái)了實(shí)現(xiàn)代碼,有需要的朋友可以參考下2016-06-06Android實(shí)現(xiàn)登陸頁(yè)logo隨鍵盤(pán)收放動(dòng)態(tài)伸縮(完美解決鍵盤(pán)彈出遮擋控件的問(wèn)題)
這篇文章主要介紹了Android實(shí)現(xiàn)登陸頁(yè)logo隨鍵盤(pán)收放動(dòng)態(tài)伸縮(完美解決鍵盤(pán)彈出遮擋控件的問(wèn)題)的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Android使用Canvas?2D實(shí)現(xiàn)循環(huán)菜單效果
循環(huán)菜單有很多種自定義方式,我們可以利用ViewPager或者RecyclerView?+?CarouselLayoutManager?或者RecyclerView?+?PageSnapHelper來(lái)實(shí)現(xiàn)這種效果,今天我們使用Canvas?2D來(lái)實(shí)現(xiàn)這種效果,感興趣的朋友可以參考下2024-01-01Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01