当前位置:   article > 正文

flutter(四)底部tabbar切换,顶部切换,页面跳转_flutter自定义 底部tabbar

flutter自定义 底部tabbar

 

你好,【程序职场】专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率,从技术到管理一步步提升自我!
 
标签:一个执着的职场程序员!

上篇文章为大家讲述了flutter的组件;(动态组件和静态组件)本篇文章接着上篇内容继续为大家介绍flutter的其他主要组件(底部选项卡,顶部切换等等实用组件),本文针对功能点做特殊实例讲解,特别详细的整体使用我们会在其它的文章中来展开说明。每篇文章只要有代码说明 就会有demo提供。

前言

一、底部tabbar

二、图片资源加载

三、库文件引用

四、顶部功能切换

五、页面跳转

六、数据传递

七、总结


一、底部tabbar

app开发,常见的首页框架就是 底部功能切换(Tabbar),tabbar作为主功能页面,展示给用户更多的切换功能,

  • 创建主页调用类,因为里面有动态布局所以继承  StatefulWidget ,
     
    1. class MyXQClient extends StatefulWidget {
    2. @override
    3. State<StatefulWidget> createState() => MyXQClientState();//调用指向MyXQClientState类
    4. }
  • 变量的定义
     
    1. final appBarTitles = ['星球', '动态', '发现', '我的'];//底部切换功能数组
    2. final tabTextStyleSelected = TextStyle(color: const Color(0xff3B9AFF));//选线卡选中字体颜色
    3. final tabTextStyleNormal = TextStyle(color: const Color(0xff969696));//选项卡未选中字体颜色
    4. Color themeColor = ThemeColorUtils.currentColorTheme;//设置主题标题背景颜色
    5. int _tabIndex = 0;//选项卡下标
    6. var tabImages;//选项卡选项图片
    7. var _body;//
    8. var pages;
     
  • 选项卡图片的样式设置
     
    1. Image getTabImage(path) {
    2. return Image.asset(path, width: 20.0, height: 20.0);
    3. }

     

  • 初始化选项卡,设置选项卡的每一个选项页面,初始化每一个页面的默认图片和选中图片
     
    1. @override
    2. void initState() {
    3. super.initState();
    4. pages = <Widget>[HomeListPage(), dongtai(), HomeListPage(), HomeListPage()];
    5. if (tabImages == null) {
    6. tabImages = [
    7. [
    8. getTabImage('images/ic_nav_news_normal.png'),
    9. getTabImage('images/ic_nav_news_actived.png')
    10. ],
    11. [
    12. getTabImage('images/ic_nav_tweet_normal.png'),
    13. getTabImage('images/ic_nav_tweet_actived.png')
    14. ],
    15. [
    16. getTabImage('images/ic_nav_discover_normal.png'),
    17. getTabImage('images/ic_nav_discover_actived.png')
    18. ],
    19. [
    20. getTabImage('images/ic_nav_my_normal.png'),
    21. getTabImage('images/ic_nav_my_pressed.png')
    22. ]
    23. ];
    24. }
    25. }

     

  • 设置选中和未选中 文本的颜色
     
    1. TextStyle getTabTextStyle(int curIndex) {//设置tabbar 选中和未选中的状态文本
    2. if (curIndex == _tabIndex) {
    3. return tabTextStyleSelected;
    4. }
    5. return tabTextStyleNormal;
    6. }

     

  • 选项卡图片的设置
     
    1. Image getTabIcon(int curIndex) {//设置tabbar选中和未选中的状态图标
    2. if (curIndex == _tabIndex) {
    3. return tabImages[curIndex][1];
    4. }
    5. return tabImages[curIndex][0];
    6. }

     

  • 切换底部选项卡,标题的变化设置
     
    1. Text getTabTitle(int curIndex) {
    2. return Text(appBarTitles[curIndex], style: getTabTextStyle(curIndex));
    3. }

     

  • 选项卡主题设置和布局结构设置
     
    1. @override
    2. Widget build(BuildContext context) {
    3. _body = IndexedStack(
    4. children: pages,
    5. index: _tabIndex,
    6. );
    7. return MaterialApp(
    8. theme: ThemeData(
    9. primaryColor: themeColor
    10. ),
    11. home: Scaffold(//布局结构
    12. appBar: AppBar(//选中每一项的标题和图标设置
    13. title: Text(appBarTitles[_tabIndex],
    14. style: TextStyle(color: Colors.white)),
    15. iconTheme: IconThemeData(color: Colors.white)
    16. ),
    17. body: _body,
    18. bottomNavigationBar: CupertinoTabBar(//
    19. items: <BottomNavigationBarItem>[
    20. BottomNavigationBarItem(
    21. icon: getTabIcon(0),
    22. title: getTabTitle(0)),
    23. BottomNavigationBarItem(
    24. icon: getTabIcon(1),
    25. title: getTabTitle(1)),
    26. BottomNavigationBarItem(
    27. icon: getTabIcon(2),
    28. title: getTabTitle(2)),
    29. BottomNavigationBarItem(
    30. icon: getTabIcon(3),
    31. title: getTabTitle(3)),
    32. ],
    33. currentIndex: _tabIndex,
    34. onTap: (index) {
    35. setState((){
    36. _tabIndex = index;
    37. });
    38. },
    39. ),
    40. // drawer: MyDrawer()
    41. ),
    42. );
    43. }
     

     

二、图片资源加载

上一步我们实现了选项卡切换,同时需要加载图片,但是图片资源怎么加载呢,目录如何读取呢?

  • 图片资源目录创建,

    在项目根目录下创建一个文件(images),名称可以自己定义,目录结构可以自己定义,所以需要用到的资源图片存放在该目录。

  • 图片目录读取

    读取图片需要按照创建目录层次读取

  • 声明资源

    图片资源需要在pubspec.yaml文件中声明资源,它将会打包到响应的package中。包本身使用的资源必须在pubspec.yaml中指定。

三、库文件引用

在开发中会用到外部资源库文件的引用,比如网络调用,可以使用库文件
在使用中需要在pubspec.yaml中声明引用,加载时需要点击 packages get  等待加载成功后使用

点击packages  get 后加载中

 

四、顶部功能切换
 

顶部切换功能,用于做模块分类,通过Scaffold ;布局结构实现,设置DefaultTabController 来设置切换的个数(length)和切换的child 

  1. @override
  2. Widget build(BuildContext context) {
  3. return Scaffold(
  4. body: DefaultTabController(
  5. length: 2,
  6. child: Scaffold(
  7. appBar: TabBar(
  8. labelColor: Colors.black,//字体颜色
  9. tabs: <Widget>[//选项卡内容
  10. Tab(
  11. text: "星球动态",
  12. ),
  13. Tab(
  14. text: "与我相关",
  15. )
  16. ],
  17. ),
  18. body: TabBarView(//选项卡 切换的内容信息展示和调用
  19. children: <Widget>[
  20. getRecBody(),
  21. getLatestBody(),
  22. ],
  23. )),
  24. ),
  25. );
  26. }


五、页面跳转

  • 异步跳转,可以在结果中处理操作

     
    1. onTap: () async {
    2. final result = await Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {
    3. return LoginPage();
    4. }));
    5. if (result != null && result == "refresh") {//做一些进入处理操作,比如加载效果
    6. // Constants.eventBus.fire(LoginEvent());
    7. }
    8. },

     

  • 同步跳转,直接进入跳转的页面
     
    1. Navigator.of(context).push(MaterialPageRoute(
    2. builder: (ctx) {
    3. // return MainPage();
    4. }
    5. ));

     

  •  

     

六、数据传递

  • 数据传递

    页面跳转中往往需要带一些参数或者数据,要求传递数据

    (1)跳转页面带数据(title)
    1. onTap: () async {
    2. final result = await Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {
    3. return LoginPage(title:"我是从上一层带过来的数据:小蜗");
    4. }));
    5. if (result != null && result == "refresh") {//做一些进入处理操作,比如加载效果
    6. // Constants.eventBus.fire(LoginEvent());
    7. }
    8. },
    (2)接受数据并传递,显示
     
    1. class LoginPage extends StatefulWidget {
    2. final String title;
    3. LoginPage({Key key, this.title});//接收数据
    4. @override
    5. createState() => new LoginPageState(title: this.title);//传递数据使用
    6. }
    1. class LoginPageState extends State<LoginPage> {
    2. String title;
    3. LoginPageState({Key key,this.title});
    4. @override
    5. Widget build(BuildContext context) {
    6. return Scaffold(
    7. appBar: AppBar(//标题bar
    8. title: Text("登录", style: TextStyle(color: Colors.white)),//标题和颜色
    9. iconTheme: IconThemeData(color: Colors.white),//返回键和颜色
    10. ),
    11. body: Container(
    12. padding: const EdgeInsets.all(10.0),
    13. child: Column(
    14. children: <Widget>[
    15. Center(child: Text("欢迎进入星球")),
    16. Center(child: Text(title)),
    17. ],
    18. ),
    19. )
    20. );
    21. }
    22. }

     

七、总结

本章重点掌握,库加载声明和图片资源声明,在页面跳转的时候使用传递更多的类型。

完整代码地址:  https://github.com/chenjianpeng/flutter/tree/master/flutter_demo002

                                                                

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/431799
推荐阅读
相关标签
  

闽ICP备14008679号