【Flutter】开发之进阶Widget(三)

栏目: ASP.NET · 发布时间: 4年前

内容简介:在上一篇中,我们了解了常用的先看效果图这里有2个方法

在上一篇中,我们了解了常用的 Widget ,这一篇,我们从实际出发,来深入学习下 Widget

案例1 模拟登陆

先看效果图

【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 的语法是 DartDart 不像 Java ,没有关键词 publicprivate 等修饰符, _ 下横线代表 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 页

先看效果图

【Flutter】开发之进阶Widget(三)
  • 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. TabBarPageView 联动

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 可以使用 ScaffoldbottomNavigationBar 属性
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TableDemo'),
      ),
      body: _pageView(),
      bottomNavigationBar: Container(
        height: 40,
        child: Center(
          child: _tabView(),
        ),
      ),
    );
  }
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式之禅

设计模式之禅

秦小波 / 机械工业出版社 / 2010年3月 / 69.00元

如果说“四人帮”的《设计模式》是设计模式领域的“圣经”,那么之后出版的各种关于设计模式的书都可称之为“圣经”的“注释版”或“圣经的故事”。本书是得道者对“圣经”的“禅悟”,它既不像“圣经”那样因为惜字如金、字字珠玑而深奥、晦涩和难懂,又比“圣经”的“注释版”更深刻和全面、更通俗和生动、更接近开发者遇到的实践场景,更具指导性。本书兼收并蓄、博采众长,也许是设计模式领域里的下一个里程碑之作。 全......一起来看看 《设计模式之禅》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试