• 前端入门Flutter--16 自定义AppBar 定义顶部Tab切换 底部Tab结合顶部Tab实现类似头条页面布局


     天有风云不测,树有叶生枯败。近日博客园更新调整,发布也只能私人查看。。。

     越是学到后期与上一章的关系越大,所以本次的内容是奖励在上一个章节的基础上开展的。为了满足ui与产品的需求,我们必须要学会自定义appbar、定义Tab顶部。

        项目目录:

       

      main.drat

     1 import 'package:flutter/material.dart';
     2 import 'pages/Tabs.dart';
     3 // import 'pages/Seacrh.dart';
     4 // import 'pages/Form.dart';
     5 import 'routes/Routes.dart';
     6 
     7 void main (){
     8   runApp(MyApp());
     9 }
    10 
    11 class MyApp extends StatelessWidget{
    12   // final routes = {
    13   //   '/search':(context,{arguments})=>SearchPage(arguments:arguments),
    14   //   '/form':(context,{arguments})=>FormPage(arguments:arguments),
    15   // };
    16 
    17   @override
    18   Widget build(BuildContext context) {
    19     // TODO: implement build
    20     return MaterialApp(
    21       // home:Tabs(),
    22     //   routes: {
    23     // '/form':(context)=>FormPage(),
    24     // '/search':(context)=>SearchPage(),
    25     //   },
    26       debugShowCheckedModeBanner: false,//去掉debug图标
    27       initialRoute:'/',//初始化的时候加载的路由
    28       onGenerateRoute: onGenerateRoute,
    29     );
    30   }
    31 }

      Routes.dart

      

     1 import 'package:flutter/material.dart';
     2 import '../pages/Tabs.dart';
     3 import '../pages/Form.dart';
     4 import '../pages/Seacrh.dart';
     5 import '../pages/Product.dart';
     6 import '../pages/ProductInfo.dart';
     7 import '../pages/AppBarDemo.dart';
     8 
     9 //配置路由
    10 final routes = {
    11   '/':(context)=>Tabs(),
    12   '/search':(context,{arguments})=>SearchPage(arguments:arguments),
    13   '/product':(context)=>ProductPage(),
    14   '/productInfo':(context,{arguments})=>ProductInfoPage(arguments:arguments),
    15   '/form':(context,{arguments})=>FormPage(arguments:arguments),
    16   '/appBar':(context)=>AppBarDemoPage(),
    17 };
    18 
    19 //固定写法
    20 var onGenerateRoute = (RouteSettings settings){
    21   final String name = settings.name;
    22   print(settings.name);
    23   final Function pageContentBuilder = routes[name];
    24   if(pageContentBuilder !=null){
    25     if(settings.arguments !=null){
    26       final Route route = MaterialPageRoute(
    27           builder: (context)=>pageContentBuilder(context,arguments:settings.arguments));
    28       return route;
    29     }else{
    30       final Route route = MaterialPageRoute(
    31           builder: (context)=>pageContentBuilder(context));
    32       return route;
    33     }
    34   }else{
    35     return null;
    36   }
    37 };

    Tabs.dart

     1 import 'package:flutter/material.dart';
     2 // import 'package:flutter_app1/AspectRation%E3%80%81Card%E5%8D%A1%E7%89%87%E7%BB%84%E4%BB%B6.dart';
     3 // import 'package:flutter_app1/BottomNavigationBar%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%95%E9%83%A8%E5%AF%BC%E8%88%AA%E6%9D%A1%E4%BB%A5%E5%8F%8A%E5%AE%9E%E7%8E%B0%E9%A1%B5%E9%9D%A2%E5%88%87%E6%8D%A2%E4%BB%A5%E5%8F%8A%E6%A8%A1%E5%9D%97%E5%8C%96/pages/tabs/Category.dart';
     4 // import 'package:flutter_app1/BottomNavigationBar%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%95%E9%83%A8%E5%AF%BC%E8%88%AA%E6%9D%A1%E4%BB%A5%E5%8F%8A%E5%AE%9E%E7%8E%B0%E9%A1%B5%E9%9D%A2%E5%88%87%E6%8D%A2%E4%BB%A5%E5%8F%8A%E6%A8%A1%E5%9D%97%E5%8C%96/pages/tabs/Setting.dart';
     5 import 'tabs/Home.dart';
     6 import 'tabs/Category.dart';
     7 import 'tabs/Setting.dart';
     8 
     9 class Tabs extends StatefulWidget{
    10   final index;
    11   Tabs({Key key,this.index=0}) : super(key: key);
    12   _TabsState createState()=>_TabsState(this.index);
    13 }
    14 class _TabsState extends State<Tabs>{
    15   int _currentIndex;
    16   _TabsState(index){
    17     this._currentIndex = index;
    18   }
    19   List _pageList=[
    20     HomePage(),
    21     CategoryPage(),
    22     SettingPage()
    23   ];
    24 
    25   @override
    26   Widget build(BuildContext context) {
    27     // TODO: implement build
    28     return Scaffold(
    29       appBar: AppBar(
    30         title: Text("Flutter Demo"),
    31       ),
    32       bottomNavigationBar: BottomNavigationBar(
    33         currentIndex: this._currentIndex,
    34         onTap:(int index){
    35         //    print(index);
    36           setState(() {
    37             this._currentIndex = index;
    38           });
    39         },
    40         iconSize: 36.0,
    41         type: BottomNavigationBarType.fixed,
    42         fixedColor: Colors.red,
    43         items: [
    44           BottomNavigationBarItem(icon: Icon(Icons.home),title: Text('首页')),
    45           BottomNavigationBarItem(icon: Icon(Icons.category),title: Text('分类')),
    46           BottomNavigationBarItem(icon: Icon(Icons.settings),title: Text('设置'))
    47         ],
    48       ),
    49       body: this._pageList[this._currentIndex],
    50     );
    51   }
    52 }

    Home.dart

     1 import 'package:flutter/material.dart';
     2 import '../Seacrh.dart';
     3 
     4 class HomePage extends StatelessWidget{
     5   const HomePage({Key key}) : super(key: key);
     6   @override
     7   Widget build(BuildContext context) {
     8     // TODO: implement build
     9     return Column(
    10       mainAxisAlignment: MainAxisAlignment.center,
    11       crossAxisAlignment: CrossAxisAlignment.center,
    12       children: <Widget>[
    13         RaisedButton(
    14             child: Text('跳转到搜索页面'),
    15             onPressed:() {
    16             //  页面跳转
    17             //  1、普通路由跳转
    18             //   Navigator.of(context).push(
    19             //    MaterialPageRoute(
    20             //      builder: (context)=>SearchPage()
    21             //    )
    22             //   );
    23             //  2、命名路由跳转
    24               Navigator.pushNamed(context, '/search',arguments:{"id":13576765});
    25             },
    26           color: Theme.of(context).accentColor,
    27           textTheme: ButtonTextTheme.primary
    28         ),
    29         RaisedButton(
    30           child: Text('跳转到商品页面'),
    31     onPressed: (){
    32       Navigator.pushNamed(context, '/product');
    33     },
    34           color: Theme.of(context).accentColor,
    35           textTheme: ButtonTextTheme.primary,
    36         ),
    37         //
    38         RaisedButton(
    39           child: Text('跳转到appBar'),
    40           onPressed: (){
    41             Navigator.pushNamed(context, '/appBar');
    42           },
    43           color: Theme.of(context).accentColor,
    44           textTheme: ButtonTextTheme.primary,
    45         )
    46       ],
    47     );
    48   }
    49 }

     Home.dart界面: 

      AppBarDemo.dart

     1 import 'package:flutter/material.dart';
     2 
     3 class AppBarDemoPage extends StatelessWidget {
     4   const AppBarDemoPage({Key key}) : super(key: key);
     5   @override
     6   Widget build(BuildContext context) {
     7     // TODO: implement build
     8     return DefaultTabController(
     9         length: 2,
    10         child: Scaffold(
    11             appBar: AppBar(
    12               title: Text("AppBarDemoPage"),
    13               centerTitle: true,
    14               actions: <Widget>[
    15                 IconButton(icon: Icon(Icons.menu), onPressed: null)
    16               ],
    17               bottom: TabBar(tabs: <Widget>[Tab(text: "热门"), Tab(text: "推荐")]),
    18             ),
    19             body: TabBarView(children: <Widget>[
    20               ListView(children: <Widget>[
    21                 ListTile(
    22                   title: Text("第一个Tab"),
    23                 ),
    24                 ListTile(
    25                   title: Text("第一个Tab"),
    26                 ),
    27                 ListTile(
    28                   title: Text("第一个Tab"),
    29                 ),
    30                 ListTile(
    31                   title: Text("第一个Tab"),
    32                 ),
    33                 ListTile(
    34                   title: Text("第一个Tab"),
    35                 ),
    36                 ListTile(title: Text("第一个Tab"))
    37               ]),
    38               ListView(children: <Widget>[
    39                 ListTile(
    40                   title: Text("第2个Tab"),
    41                 ),
    42                 ListTile(
    43                   title: Text("第2个Tab"),
    44                 ),
    45                 ListTile(
    46                   title: Text("第2个Tab"),
    47                 ),
    48                 ListTile(
    49                   title: Text("第2个Tab"),
    50                 ),
    51                 ListTile(
    52                   title: Text("第2个Tab"),
    53                 ),
    54                 ListTile(title: Text("第2个Tab"))
    55               ]),
    56             ])));
    57   }
    58 }

    appbar界面:

  • 相关阅读:
    数据结构和算法(Golang实现)(9)基础知识-算法复杂度及渐进符号
    基于深度学习方法的dota2游戏数据分析与胜率预测(python3.6+keras框架实现)
    基于CBOW网络手动实现面向中文语料的word2vec
    《Machine Learning Yearing》读书笔记
    使用神经网络预测航班起飞准点率
    使用LSTM-RNN建立股票预测模型
    基于selenium+phantomJS的动态网站全站爬取
    TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结
    学习笔记--python中使用多进程、多线程加速文本预处理
    通过外汇对冲手段稳定获利的可行性验证
  • 原文地址:https://www.cnblogs.com/CMirs/p/14577592.html
Copyright © 2020-2023  润新知