内容简介:在上一篇中,我们了解了常用的先看效果图这里有2个方法
在上一篇中,我们了解了常用的 Widget
,这一篇,我们从实际出发,来深入学习下 Widget
。
案例1 模拟登陆
先看效果图
- 1.我们需要2个输入框,1个按钮 这里用到的都是之前说过的
Widget
,就直接贴代码了,建议先看这篇 【Flutter】开发之基础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: <Widget>[ 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.需要获取输入的内容
这里有2个方法
1). 处理 onChanged
回调
TextField( //文字改变时调用 onChanged: (String content) { print("content=" + content); } 复制代码
2). 提供一个 TextEditingController
TextEditingController user = new TextEditingController(); TextField( ...省略... controller: user , ...省略... ) 复制代码
然后通过 user.text
方法即可取得输入内容。
- 3.点击事件
1).可以通过 onPressed
实现
FlatButton( onPressed: () { //显示弹窗 _showDialog(context); }) 复制代码
注: Flutter
的语法是 Dart
, Dart
不像 Java
,没有关键词 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位'), ); }, ); } } 复制代码
正常的逻辑来说,弹出窗中应该有按钮,点击重新输入,但是却发现,有的 Widget
没有点击事件,这时,我们可以通过在外面嵌套 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: <Widget>[ GestureDetector( child: Container( child: Text('重新输入'), ), onTap: () { pwd.clear(); //关闭弹窗 Navigator.of(context).pop(); }, ), ], ); }, ); } } 复制代码
案例2 Table 页
先看效果图
- 1.
TabBar
上半部分使用的是AppBar
+TabBar
,详细代码如下:
@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), //点击事件 onTap: (index) { }, //未选中的颜色 unselectedLabelColor: Colors.pink, //未选中样式 unselectedLabelStyle: TextStyle(fontSize: 14), //指示器的宽度 indicatorSize: TabBarIndicatorSize.tab, //指示器颜色 indicatorColor: Colors.amber, //指示器高度 indicatorWeight: 2, tabs: <Widget>[ 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: <Widget>[ 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
联动
PageView
的控制使用的是 PageController
1).初始化
PageController pageController = new PageController();
2).在 PageView
中声明
PageView( ...省略... controller: pageController, ...省略... ) 复制代码
3).在 TabBar
中使用
TabBar( ...省略... //点击事件 onTap: (index) { pageController.jumpToPage(index); }, ...省略... ) 复制代码
TabBar
的控制使用的是 TabController
需要注意
我们的父级 Widget
必须是继承 StatefulWidget
;需要实现 SingleTickerProviderStateMixin
1).初始化
class TableDemo extends StatefulWidget { @override _TableDemoState createState() => _TableDemoState(); } class _TableDemoState extends State<TableDemo> with SingleTickerProviderStateMixin { TabController _tabController; @override void initState() { super.initState(); ///初始化时创建控制器 ///通过 with SingleTickerProviderStateMixin 实现动画效果。 _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.扩展 底部Table 可以使用
Scaffold
的bottomNavigationBar
属性
Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('TableDemo'), ), body: _pageView(), bottomNavigationBar: Container( height: 40, child: Center( child: _tabView(), ), ), ); } 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架
- Java开发人员的Flex开发
- Java开发人员的Flex开发
- 行为驱动开发让开发做正确事
- 让开发者专注于应用开发,OpenCenter 3.0 开发者预览版发布
- 让开发者专注于应用开发,OpenCenter 3.0 开发者预览版发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX编程环境
Brian W.Kernighan、Rob Pike / 陈向群/等 / 机械工业出版社 / 1999-10-1 / 24.00
本书对UNIX操作系统的编程环境做了详细而深入的讨论,内容包括UNIX的文件系统、Shell、过滤程序、I/O编程、系统调用等,并对UNIX中的程序开发方法做了有针对性的指导。本书内容深入浅出,实例丰富,无论是UNIX系统的初学者还是专业人员都可从本书受益。本书亦可作为大学生、研究生学习UNIX的教材。一起来看看 《UNIX编程环境》 这本书的介绍吧!