前端开发进阶篇——Flutter实战之不规则导航
1. 主入口文件
import 'package:flutter/material.dart'; import 'package:flutter_demo/BottomAppBarDemo.dart'; void main(List<String> args) { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.lightBlue), home: BottomAppBarDemo(), ); } }
这个文件我们首先定义了页面的骨架,其中包含标题,主题颜色,以及主界面home,接下来我们就需要编写BottomAppBarDemo.dart来实现主页面。
2. 子页面编写
上篇文章中我们做的导航栏是每个子页面分别继承StatelessWidget
写一个文件,且大部分代码相同。所以我们需要精简我们的代码,我们需要编写一个文件
eachView.dart来实现动态生成子页面。eachView需要继承StatefulWidget
的可变控件,通过传递不同的参数实现不同的页面,代码如下:
import 'package:flutter/material.dart'; class EachView extends StatefulWidget { final String _title; EachView(this._title); @override _EachViewState createState() => _EachViewState(); } class _EachViewState extends State<EachView> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget._title), ), body: Center( child: Text(widget._title), ), ); } }
我们定义了一个变量_title用于表示子页面的标题,每次通过其他页面调用eachViewd的构造函数EachView(this._title)进行初始化,并创建子页面将传递的参数动态显示在子页面上。
在开始写主页面开始之前我们需要了解一些控件,floatingActionButton,可交互浮动按键。它包括以下属性:
onPressed :点击相应事件,最常用的一个属性。
tooltip:长按显示的提示文字。
child :放置子元素,一般放置Icon Widget。
floatingActionButton: FloatingActionButton( onPressed: (){ Navigator.of(context).push(MaterialPageRoute(builder:(BuildContext context){ return EachView('New Page'); })); }, tooltip: 'Increment', child: Icon( Icons.add, color: Colors.white, ), ),
上面的代码就是我们新建的floatingActionButton可交互浮动按键,点击它会生成一个我们前面介绍的子页面EachView传递'new page'参数过去。下面是完整的主页面代码:
import 'package:flutter/material.dart'; import 'page/eachView.dart'; class BottomAppBarDemo extends StatefulWidget { BottomAppBarDemo({Key key}) : super(key: key); @override _BottomAppBarDemoState createState() => _BottomAppBarDemoState(); } class _BottomAppBarDemoState extends State<BottomAppBarDemo> { List<Widget> _eachView; int _index = 0; void initState() { super.initState(); _eachView = List(); _eachView..add(EachView('Home'))..add(EachView('Me')); } @override Widget build(BuildContext context) { return Scaffold( body: _eachView[_index], floatingActionButton: FloatingActionButton( onPressed: () { Navigator.of(context) .push(MaterialPageRoute(builder: (BuildContext context) { return EachView('New Page'); })); }, tooltip: 'Increment', child: Icon( Icons.add, color: Colors.white, ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( color: Colors.lightBlue, shape: CircularNotchedRectangle(), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ IconButton( icon: Icon(Icons.home), onPressed: () { setState(() { _index = 0; }); }, color: Colors.white), IconButton( icon: Icon(Icons.airport_shuttle), onPressed: () { setState(() { _index = 1; }); }, color: Colors.white), ], ), ), ); } }
运行程序初始化如下图:
点击导航显示分别如下图
······
- 点赞
- 收藏
- 关注作者
评论(0)