前端开发进阶篇——Flutter实战之导航
1. 入口文件编写
我们先写一个主入口文件,包含了APP通用结构,最主要的是要引入自定义的BottomNavigationWidget组件。
import 'package:flutter/material.dart'; import 'bottomNavigationWidget.dart'; void main(List<String> args) { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'flutter bttom', theme: ThemeData.light(), home: BottomNavigationWidget(), ); } }
2.bottomNavigationWidget.dart
文件编写
StatefulWidget具有可变状态(state)的窗口组件(widget)。使用这个要根据变化状态,调整State值。在lib目录下,新建一个bottomNavigationWidget.dart文件。
@override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: BottomNavigationBar(items: [ BottomNavigationBarItem(icon: Icon( Icons.home, color:_bottomNavigationColor, ), title: Text( 'Home', style: TextStyle(color: _bottomNavigationColor), ) ), BottomNavigationBarItem(icon: Icon( Icons.phone, color:_bottomNavigationColor, ), title: Text( 'Phone', style: TextStyle(color: _bottomNavigationColor), ) ), BottomNavigationBarItem(icon: Icon( Icons.email, color:_bottomNavigationColor, ), title: Text( 'Email', style: TextStyle(color: _bottomNavigationColor), ) ), ], type: BottomNavigationBarType.fixed ) ); }
现在只是一个静态的页面,下面的导航点击还没有效果。运行效果如下图:
3. 子页面编写
子页面我们就采用只放入一个AppBar
和一个Center
,然后用Text Widget表明即可。先来写一个HomeScreen组件,新建一个page目录,然后在目录下面新建
HomePage.dart、page/PhonePage.dart、page/EmailPage.dart三个文件。
import 'package:flutter/material.dart'; class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar:AppBar( title: Text('Home'), ), body: Center( child:Text('Home'), ), ); } }
我们要重新initState()方法,把刚才做好的页面进行初始化到一个Widget数组中。有了数组就可以根据数组的索引来切换不同的页面了。
@override void initState() { super.initState(); pageList ..add(HomePage()) ..add(EmailPage()) ..add(PhonePage()); }
..add()是Dart语言的..语法,返回调用者本身。
BottomNavigationBar组件里提供了一个相应事件onTap,这个事件自带一个索引值index,通过索引值我们就可以和我们list里的索引值相对应了。
onTap: (int index){ setState(() { _currentIndex = index; }); },
完整代码如下:
import 'package:flutter/material.dart'; import 'page/HomePage.dart'; import 'page/PhonePage.dart'; import 'page/EmailPage.dart'; class BottomNavigationWidget extends StatefulWidget { @override _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState(); } class _BottomNavigationWidgetState extends State<BottomNavigationWidget> { final _bottomNavigationColor = Colors.lightBlue; List<Widget> pageList = List(); int _currentIndex = 0; @override void initState() { super.initState(); pageList ..add(HomePage()) ..add(EmailPage()) ..add(PhonePage()); } @override Widget build(BuildContext context) { return Scaffold( body: pageList[_currentIndex], bottomNavigationBar: BottomNavigationBar(items: [ BottomNavigationBarItem(icon: Icon( Icons.home, color:_bottomNavigationColor, ), title: Text( 'Home', style: TextStyle(color: _bottomNavigationColor), ) ), BottomNavigationBarItem(icon: Icon( Icons.phone, color:_bottomNavigationColor, ), title: Text( 'Phone', style: TextStyle(color: _bottomNavigationColor), ) ), BottomNavigationBarItem(icon: Icon( Icons.email, color:_bottomNavigationColor, ), title: Text( 'Email', style: TextStyle(color: _bottomNavigationColor), ) ), ], currentIndex: _currentIndex, onTap: (int index){ setState(() { _currentIndex = index; }); }, type: BottomNavigationBarType.fixed ) ); } }
运行结果如下:
- 点赞
- 收藏
- 关注作者
评论(0)