摘要:頁面銷毀時,銷毀控制器在中聲明省略省略在中使用省略省略擴(kuò)展底部可以使用的屬性你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝
前言在上一篇中,我們了解了常用的Widget,這一篇,我們從實(shí)際案例出發(fā),來深入學(xué)習(xí)下Widget。
案例1 模擬登陸先看效果圖
1.我們需要2個輸入框,1個按鈕 這里用到的都是之前說過的Widget,就直接貼代碼了,建議先看這篇【Flutter】開發(fā)之基礎(chǔ)Widget(二)
class LoginDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("LoginDemo"),
),
body: Container(
margin: EdgeInsets.all(15),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(top: 100),
),
TextField(
decoration: InputDecoration(
hintText: "請輸入賬戶",
hintStyle: TextStyle(color: Colors.black45),
contentPadding: EdgeInsets.all(10),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4),
)),
),
Padding(
padding: EdgeInsets.only(top: 15),
),
TextField(
//顯示*號
obscureText: true,
decoration: InputDecoration(
hintText: "請輸入密碼",
hintStyle: TextStyle(color: Colors.black45),
contentPadding: EdgeInsets.all(10),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4),
)),
),
Padding(
padding: EdgeInsets.only(top: 50),
),
FlatButton(
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(10)),
child: Container(
height: 50,
width: 300,
decoration: BoxDecoration(color: Colors.deepOrangeAccent),
alignment: AlignmentDirectional.center,
child: Text(
"登錄",
style: TextStyle(
fontSize: 18,
color: Colors.white,
backgroundColor: Colors.deepOrangeAccent,
),
),
),
),
)
],
),
),
);
}
}
2.需要獲取輸入的內(nèi)容
這里有2個方法
1). 處理?onChanged回調(diào)
TextField(
//文字改變時調(diào)用
onChanged: (String content) {
print("content=" + content);
}
2). 提供一個TextEditingController
TextEditingController user = new TextEditingController();
TextField(
...省略...
controller: user ,
...省略...
)
然后通過user.text方法即可取得輸入內(nèi)容。
3.點(diǎn)擊事件
1).可以通過onPressed實(shí)現(xiàn)
FlatButton(
onPressed: () {
//顯示彈窗
_showDialog(context);
})
注:Flutter 的語法是 Dart,Dart 不像 Java ,沒有關(guān)鍵詞 public、private 等修飾符,_ 下橫線代表 private ,但是有 @protected 注解。 然后,我們需要判斷密碼是否大于6位,如不是,彈窗提示
void _showDialog(BuildContext context) {
if (pwd.text.length < 6) {
showDialog(
context: context,
builder: (BuildContext content) {
return AlertDialog(
title: Text("提示"),
content: Text("輸入的密碼不能小于6位"),
);
},
);
}
}
正常的邏輯來說,彈出窗中應(yīng)該有按鈕,點(diǎn)擊重新輸入,但是卻發(fā)現(xiàn),有的Widget沒有點(diǎn)擊事件,這時,我們可以通過在外面嵌套GestureDetector來處理,GestureDetector還有更多的功能,這個我們后面再說 2).嵌套GestureDetector
void _showDialog(BuildContext context) {
if (pwd.text.length < 6) {
showDialog(
context: context,
builder: (BuildContext content) {
return AlertDialog(
title: Text("提示"),
content: Text("輸入的密碼不能小于6位"),
actions: [
GestureDetector(
child: Container(
child: Text("重新輸入"),
),
onTap: () {
pwd.clear();
//關(guān)閉彈窗
Navigator.of(context).pop();
},
),
],
);
},
);
}
}
案例2 Table 頁
先看效果圖
1.TabBar 上半部分使用的是AppBar+TabBar,詳細(xì)代碼如下:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("TableDemo"),
bottom: TabBar(
//可以滑動
isScrollable: true,
//邊距
labelPadding: EdgeInsets.only(right: 0),
//顏色
labelColor: Colors.orangeAccent,
//樣式 選中的
labelStyle: TextStyle(fontSize: 18),
//點(diǎn)擊事件
onTap: (index) {
},
//未選中的顏色
unselectedLabelColor: Colors.pink,
//未選中樣式
unselectedLabelStyle: TextStyle(fontSize: 14),
//指示器的寬度
indicatorSize: TabBarIndicatorSize.tab,
//指示器顏色
indicatorColor: Colors.amber,
//指示器高度
indicatorWeight: 2,
tabs: [
Container(
width: 100,
height: 40,
child: Center(
child: Text("MODEL 1"),
),
),
Container(
width: 100,
height: 40,
child: Center(
child: Text("MODEL 2"),
),
),
Container(
width: 100,
height: 40,
child: Center(
child: Text("MODEL 3"),
),
),
],
),
),
}
2.PageView
用法類似于ListView
PageView.builder
PageView.custom
PageView.builder(
itemBuilder: (BuildContext context, int index) {
return Container(
child: Center(
child: Text("PAGE ${index}"),
),
);
},
itemCount: 5,
onPageChanged: (indext) {},
),
方便起見,我們這里使用的是children
Widget _pageView() {
return PageView(
children: [
Container(
color: Colors.blue,
alignment: AlignmentDirectional.center,
child: Text("PAGE 1"),
),
Container(
color: Colors.deepPurpleAccent,
alignment: AlignmentDirectional.center,
child: Text("PAGE 2"),
),
Container(
color: Colors.lightGreen,
alignment: AlignmentDirectional.center,
child: Text("PAGE 3"),
),
],
onPageChanged: (index) {
},
);
}
3.TabBar和PageView 聯(lián)動
PageView的控制使用的是PageController
1).初始化
PageController pageController = new PageController();
2).在PageView中聲明
PageView( ...省略... controller: pageController, ...省略... )
3).在TabBar中使用
TabBar(
...省略...
//點(diǎn)擊事件
onTap: (index) {
pageController.jumpToPage(index);
},
...省略...
)
TabBar的控制使用的是TabController
需要注意
我們的父級Widget必須是繼承StatefulWidget;需要實(shí)現(xiàn)SingleTickerProviderStateMixin
1).初始化
class TableDemo extends StatefulWidget {
@override
_TableDemoState createState() => _TableDemoState();
}
class _TableDemoState extends State<TableDemo>
with SingleTickerProviderStateMixin {
TabController _tabController;
@override
void initState() {
super.initState();
///初始化時創(chuàng)建控制器
///通過 with SingleTickerProviderStateMixin 實(shí)現(xiàn)動畫效果。
_tabController = new TabController(vsync: this, length: 3);
}
@override
void dispose() {
///頁面銷毀時,銷毀控制器
_tabController.dispose();
super.dispose();
}
}
2).在TabBar中聲明
TabBar( ...省略... controller: _tabController, ...省略... )
3).在PageView中使用
PageView( ...省略... onPageChanged: (index) { _tabController.animateTo(index); }, ...省略... )
4.擴(kuò)展 底部Table 可以使用Scaffold的bottomNavigationBar屬性
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("TableDemo"),
),
body: _pageView(),
bottomNavigationBar: Container(
height: 40,
child: Center(
child: _tabView(),
),
),
);
}
你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7310.html
摘要:與此同時,因新冠疫情的影響使得用戶對移動應(yīng)用程序的需求激增。調(diào)查報(bào)告顯示年移動應(yīng)用程序已經(jīng)產(chǎn)生了億美元的收入,預(yù)計(jì)到年將產(chǎn)生億美元的收入。 引言 計(jì)劃在2021年進(jìn)...
摘要:月日,谷歌正式發(fā)布了的。到底能不能成為跨平臺開發(fā)終極之選是基于前端誕生的,但是對前端開發(fā)來說,的環(huán)境配置很麻煩,需要原生的平臺知識,還要擔(dān)心遇上網(wǎng)絡(luò)問題?,F(xiàn)在已經(jīng)不是曾經(jīng)的小眾框架,這兩年里它已經(jīng)逐步成長為主流的跨平臺開發(fā)框架之一。 ...
摘要:開發(fā)之目錄頁面跳轉(zhuǎn)的頁面跳轉(zhuǎn),主要是通過來實(shí)現(xiàn),類似原生中的路由,分為靜態(tài)和動態(tài)種方式。添加添加,這時,就可以這樣使用你的認(rèn)可,是我堅(jiān)持更新博客的動力,如果覺得有用,就請點(diǎn)個贊,謝謝 前言 這一篇,我們說說開發(fā)中會用到的地方。 【Flutter】開發(fā)之目錄 頁面跳轉(zhuǎn) Flutter的頁面跳轉(zhuǎn),主要是通過Navigator來實(shí)現(xiàn),類似原生中的路由,分為靜態(tài)和動態(tài)2種方式。 靜態(tài) 首先...
摘要:注釋處的方法是程序的入口,使用了符號,這是中單行函數(shù)或方法的簡寫,等價于如下代碼方法是框架的入口,如果不返回方法,那么執(zhí)行的是一個控制臺應(yīng)用。 本文首發(fā)于微信公眾號「劉望舒」 前言 最近的Google I/O大會上,F(xiàn)lutter1.5 開始支持移動、Web、桌面和嵌入式設(shè)備,從不溫不火的sky一直進(jìn)化到如今熱門的Flutter,F(xiàn)lutter的發(fā)展已經(jīng)超出很多人的想象。我對跨平臺技術(shù)一...
閱讀 2190·2021-09-22 10:56
閱讀 1492·2021-09-07 10:11
閱讀 1813·2019-08-30 15:54
閱讀 2299·2019-08-30 15:44
閱讀 2318·2019-08-29 12:40
閱讀 3040·2019-08-28 18:25
閱讀 1750·2019-08-26 10:24
閱讀 3195·2019-08-23 18:39