入坑进行时。。
完整示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import 'package:flutter/material.dart';
class AppIndexPage extends StatefulWidget {
@override //元数据注解
State<StatefulWidget> createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<AppIndexPage> with SingleTickerProviderStateMixin {
TabController _tabcontroller;
List tabList = ['首页', '更多', '我的'];
var _selectedIndex = 0;
@override
// 生命周期 初始化状态
void initState(){
super.initState();
_tabcontroller = new TabController(vsync: this,length: tabList.length);
}
void _onItemTapped(int index){
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar( //导航栏
title: Text("Demo App"),
actions: <Widget>[ //导航栏右侧菜单
IconButton(icon: Icon(Icons.share), onPressed: () {}),
],
bottom: TabBar(
controller: _tabcontroller,
tabs: tabList.map((e) => Tab(text:e)).toList(),
),
),
bottomNavigationBar:BottomNavigationBar(
currentIndex: _selectedIndex,
items: tabList.map((e) => BottomNavigationBarItem(icon:Icon(Icons.home),title:Text(e))).toList(),
onTap: _onItemTapped,
),
);
}
}
|
过程分解
1. 定义一个控制器 TabController 用于监听 tab菜单切换 并初始化
1
2
3
4
5
6
|
@override
void initState(){
super.initState();
_tabcontroller = new TabController(vsync: this,length: tabList.length);
}
|
2.定义一个 List(数组) 此数组可以为 consts
const和final的区别 final 实例化时生成 const 运行时生成
tabbar tabs属性可接受一个Widget数组 可直接生成,也可以使用其他组件。
Widget build(BuildContext context) {} //生成Widget的页面样式使用此方法 Widget build
build 中可以返回 widget ,也可以 使用 MaterialApp
> Material应用程序以MaterialApp widget开始, 该widget在应用程序的根部创建了一些有用的widget,比如一个Theme,它配置了应用的主题。
疑问: 如何在子元素中访问 初始化的应用和层序根部的widget,比如Theme。
Scaffold
Flutter Material库提供了一个Scaffold Widget,它是一个路由页的骨架,可以非常容易的拼装出一个完整的页面。
TabBar和TabBarView的controller是同一个以此来实现菜单切换和滑动状态同步。
4. 使用 Material 组件库提供Meterial风格的 Tab菜单
5.BottomNavigationBar 同理