1.底部导航基础样式

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'bottome_navigation_widget.dart';
  3. void main() =>runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "Flutter 底部导航",
  9. theme: ThemeData.light(),//默认形态 默认皮肤
  10. home: BottomNavigationWidget(),
  11. );
  12. }
  13. }

bottome_navigation_widget.dart文件

  1. import 'package:flutter/material.dart';
  2. class BottomNavigationWidget extends StatefulWidget {//动态widget
  3. @override
  4. _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();
  5. }
  6. class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {
  7. final _BottomNavigationColor=Colors.blue; //定义颜色
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold( //脚手架相对于一个磨具,定义好位置
  11. bottomNavigationBar: BottomNavigationBar(
  12. items: [
  13. BottomNavigationBarItem(icon: Icon(Icons.home,color: _BottomNavigationColor),//设置图标+颜色
  14. title: Text(
  15. "首页",
  16. style: TextStyle(color: _BottomNavigationColor),
  17. )
  18. ), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet,color: _BottomNavigationColor),//设置图标+颜色
  19. title: Text(
  20. "钱包",
  21. style: TextStyle(color: _BottomNavigationColor),
  22. )
  23. ), BottomNavigationBarItem(icon: Icon(Icons.airplay_sharp,color: _BottomNavigationColor),//设置图标+颜色
  24. title: Text(
  25. "商品",
  26. style: TextStyle(color: _BottomNavigationColor),
  27. )
  28. ), BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded,color: _BottomNavigationColor),//设置图标+颜色
  29. title: Text(
  30. "个人中心",
  31. style: TextStyle(color: _BottomNavigationColor),
  32. )
  33. ),
  34. ],
  35. ),
  36. );
  37. }
  38. }

2.导航栏的跳转

shifting模式(导航栏点进去才显示与图标相关的文本)

20190304151830905.gif

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'bottome_navigation_widget.dart';
  3. void main() =>runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "Flutter 底部导航",
  9. theme: ThemeData.light(),//默认形态 默认皮肤
  10. home: BottomNavigationWidget(),
  11. );
  12. }
  13. }

bottome_navigation_widget.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'pages/airplay_screen.dart';
  3. import 'pages/home_screen.dart';
  4. import 'pages/money_screen.dart';
  5. import 'pages/pages_screen.dart';
  6. class BottomNavigationWidget extends StatefulWidget {//动态widget
  7. @override
  8. _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();
  9. }
  10. class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {
  11. final _BottomNavigationColor=Colors.black; //定义颜色
  12. int _currentIndex=0;//声明一个索引
  13. List<Widget> list=List();
  14. @override
  15. void initState(){
  16. list
  17. ..add(HomeScreen())
  18. ..add(MoneyScreen())
  19. ..add(AirplayScreen())
  20. ..add(PagesScreen());
  21. super.initState();
  22. }
  23. @override
  24. Widget build(BuildContext context) {
  25. return Scaffold( //脚手架相对于一个磨具,定义好位置
  26. body: list[_currentIndex],//屏幕中间的主题
  27. bottomNavigationBar: BottomNavigationBar(
  28. items: <BottomNavigationBarItem>[
  29. BottomNavigationBarItem(icon: Icon(Icons.home,color: _BottomNavigationColor),//设置图标+颜色
  30. title: Text(
  31. "首页",
  32. style: TextStyle(color: _BottomNavigationColor),
  33. ),
  34. backgroundColor: Colors.blue,
  35. ), BottomNavigationBarItem(
  36. icon: Icon(Icons.airplay_sharp,color: _BottomNavigationColor),//设置图标+颜色
  37. title: Text(
  38. "商品",
  39. style: TextStyle(color: _BottomNavigationColor),
  40. ),
  41. backgroundColor: Colors.amber,
  42. ), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet,color: _BottomNavigationColor),//设置图标+颜色
  43. title: Text(
  44. "钱包",
  45. style: TextStyle(color: _BottomNavigationColor),
  46. ),
  47. backgroundColor: Colors.green,
  48. ),BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded,color: _BottomNavigationColor),//设置图标+颜色
  49. title: Text(
  50. "个人中心",
  51. style: TextStyle(color: _BottomNavigationColor),
  52. ),
  53. backgroundColor: Colors.red,
  54. ),
  55. ],
  56. currentIndex: _currentIndex,//那个是高亮(被选中)
  57. selectedItemColor: Colors.pink,
  58. onTap: (int index){ //点击事件添加index
  59. setState(() {
  60. _currentIndex=index;
  61. });
  62. },
  63. ),
  64. );
  65. }
  66. }

在lib下创建pages文件夹

home_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. class HomeScreen extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("这是首页"),
  8. ),
  9. body: Center(child: Text("首页呀"),),
  10. );
  11. }
  12. }

money_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. class MoneyScreen extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("这是钱包"),
  8. ),
  9. body: Center(child: Text("钱包呀"),),
  10. );
  11. }
  12. }

airplay_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. class AirplayScreen extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("这是商品"),
  8. ),
  9. body: Center(child: Text("商品"),),
  10. );
  11. }
  12. }

pages_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. class PagesScreen extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("这是页"),
  8. ),
  9. body: Center(child: Text("页呀"),),
  10. );
  11. }
  12. }

fixed模式

20190304151915134.gif

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'bottome_navigation_widget.dart';
  3. void main() =>runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "Flutter 底部导航",
  9. theme: ThemeData(
  10. primaryColor: Colors.deepOrangeAccent//可修改主题颜色
  11. ),//默认形态 默认皮肤
  12. home: BottomNavigationWidget(),
  13. );
  14. }
  15. }

在bottome_navigation_widget.dart的Widget匿名函数里的bottomNavigationBar里面加入

type: BottomNavigationBarType.fixed,

  1. import 'package:flutter/material.dart';
  2. import 'pages/airplay_screen.dart';
  3. import 'pages/home_screen.dart';
  4. import 'pages/money_screen.dart';
  5. import 'pages/pages_screen.dart';
  6. class BottomNavigationWidget extends StatefulWidget {//动态widget
  7. @override
  8. _BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();
  9. }
  10. class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {
  11. final _BottomNavigationColor=Colors.black; //定义颜色
  12. int _currentIndex=0;//声明一个索引
  13. List<Widget> list=List();
  14. @override
  15. void initState(){
  16. list
  17. ..add(HomeScreen())
  18. ..add(MoneyScreen())
  19. ..add(AirplayScreen())
  20. ..add(PagesScreen());
  21. super.initState();
  22. }
  23. @override
  24. Widget build(BuildContext context) {
  25. return Scaffold( //脚手架相对于一个磨具,定义好位置
  26. body: list[_currentIndex],//屏幕中间的主题
  27. bottomNavigationBar: BottomNavigationBar(
  28. items: <BottomNavigationBarItem>[
  29. BottomNavigationBarItem(icon: Icon(Icons.home),
  30. title: Text(
  31. "首页",
  32. ),
  33. ), BottomNavigationBarItem(
  34. icon: Icon(Icons.airplay_sharp),
  35. title: Text(
  36. "商品",
  37. ),
  38. ), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet),
  39. title: Text(
  40. "钱包",
  41. ),
  42. ),BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded),
  43. title: Text(
  44. "个人中心",
  45. ),
  46. ),
  47. ],
  48. currentIndex: _currentIndex,//那个是高亮(被选中)
  49. type: BottomNavigationBarType.fixed,//fixedColor指定的颜色,可以让文本和图标一起显示
  50. onTap: (int index){ //点击事件添加index
  51. setState(() {
  52. _currentIndex=index;
  53. });
  54. },
  55. ),
  56. );
  57. }
  58. }

不规则导航栏

image.png

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'bottom_appBar_demo.dart';
  3. void main() => runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "不规则导航栏",
  9. //自定义主题样本
  10. theme: ThemeData(
  11. primarySwatch: Colors.lime
  12. ),
  13. home: BottomAppBarDemo(),
  14. );
  15. }
  16. }

bottom_appBar_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'each_view.dart';
  3. class BottomAppBarDemo extends StatefulWidget {//动态样式
  4. @override
  5. _BottomAppBarDemoState createState() => _BottomAppBarDemoState();
  6. }
  7. class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
  8. List<Widget> _list;
  9. int _index=0;
  10. @override
  11. void initState() {//初始化状态方法
  12. // TODO: implement initState
  13. super.initState();
  14. _list=List();
  15. _list..add(EachView("我是主页"))..add(EachView("我是床"));
  16. }
  17. @override
  18. Widget build(BuildContext context) {
  19. return Scaffold(
  20. body: _list[_index],
  21. //可交互浮动按钮FAB
  22. floatingActionButton: FloatingActionButton(
  23. //响应方式
  24. onPressed: (){
  25. Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context){
  26. return EachView("我是+++");
  27. }));
  28. },
  29. tooltip: "我是长按文字",
  30. child: Icon(
  31. Icons.add,
  32. color: Colors.white,
  33. ),
  34. ),
  35. floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
  36. bottomNavigationBar: BottomAppBar(//BottomAppBar工具栏
  37. color: Colors.lime,
  38. shape: CircularNotchedRectangle(),//与floatingActionButton如何时需要一个缺口(CircularNotchedRectangle圆形缺口)
  39. child: Row(
  40. mainAxisSize: MainAxisSize.max,
  41. mainAxisAlignment: MainAxisAlignment.spaceAround,
  42. children: <Widget>[
  43. IconButton(
  44. icon: Icon(Icons.home,),
  45. color: Colors.white,
  46. onPressed: (){
  47. setState(() {
  48. _index=0;
  49. });
  50. },),
  51. IconButton(
  52. icon: Icon(Icons.airline_seat_individual_suite),
  53. color: Colors.white,
  54. onPressed: (){
  55. setState(() {
  56. _index=1;
  57. });
  58. },),
  59. ],
  60. ),
  61. ),
  62. );
  63. }
  64. }

each_view.dart文件

  1. import 'package:flutter/material.dart';
  2. class EachView extends StatefulWidget {
  3. String _title;
  4. EachView(this._title);//获取上一个页面给的参数
  5. @override
  6. _EachViewState createState() => _EachViewState();
  7. }
  8. class _EachViewState extends State<EachView> {
  9. @override
  10. Widget build(BuildContext context) {
  11. return Scaffold(
  12. appBar: AppBar(
  13. title: Text(widget._title),
  14. ),
  15. body: Center(
  16. child: Text(widget._title),
  17. ),
  18. );
  19. }
  20. }

3.动画效果

路由跳转动画

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'pages.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "炫酷导航",
  11. //自定义主题样本
  12. theme: ThemeData(
  13. primarySwatch: Colors.pink
  14. ),
  15. home: FirsPage(),
  16. );
  17. }
  18. }

pages.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'custime_router.dart';
  3. class FirsPage extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return Scaffold(
  7. backgroundColor: Colors.pink,
  8. appBar: AppBar(
  9. title: Text("第一页",style: TextStyle(fontSize: 36.0),),
  10. //与底部融合
  11. elevation: 0.0,
  12. ),
  13. body: Center(
  14. child: MaterialButton(
  15. child: Icon(
  16. Icons.navigate_next,
  17. color: Colors.white,
  18. size: 64.0,
  19. ),
  20. onPressed: (){
  21. Navigator.of(context).push(CustimeRouter(SecondPage()));
  22. },
  23. ),
  24. ),
  25. );
  26. }
  27. }
  28. class SecondPage extends StatelessWidget {
  29. @override
  30. Widget build(BuildContext context) {
  31. return Scaffold(
  32. backgroundColor: Colors.deepPurple,
  33. appBar: AppBar(
  34. title: Text("第二页",style: TextStyle(fontSize: 36.0),),
  35. backgroundColor: Colors.deepPurple,
  36. leading: Container(),
  37. //与底部融合
  38. elevation: 0.0,
  39. ),
  40. body: Center(
  41. child: MaterialButton(
  42. child: Icon(
  43. Icons.navigate_before,
  44. color: Colors.white,
  45. size: 64.0,
  46. ),
  47. onPressed: (){
  48. Navigator.of(context).pop();
  49. },
  50. ),
  51. ),
  52. );
  53. }
  54. }

custime_router.dart文件

  1. import 'package:flutter/material.dart';
  2. class CustimeRouter extends PageRouteBuilder{
  3. final Widget widget;
  4. //继承父类重写
  5. CustimeRouter(this.widget):super(
  6. //过度时间
  7. transitionDuration: Duration(seconds: 1),
  8. pageBuilder: (
  9. BuildContext context,
  10. Animation<double> animation1,
  11. Animation<double> animation2,
  12. ){
  13. return widget;
  14. },
  15. transitionsBuilder: (
  16. BuildContext context,
  17. Animation<double> animation1,
  18. Animation<double> animation2,
  19. Widget child
  20. ){
  21. //渐隐渐先动画
  22. /* return FadeTransition(opacity: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),
  23. child: child,
  24. );*/
  25. //缩放动画效果
  26. /* return ScaleTransition(scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),
  27. child: child,
  28. );*/
  29. //旋转加缩放
  30. /*return RotationTransition(turns: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),
  31. child: ScaleTransition(scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),
  32. child: child,),
  33. );*/
  34. //左右滑动
  35. return SlideTransition(position: Tween<Offset>(begin: Offset(-1.0,0.0),end: Offset(0.0,0.0)).animate(CurvedAnimation(parent: animation1, curve: Curves.decelerate)),
  36. child: child,
  37. );
  38. }
  39. );
  40. }

4.磨砂特效(层叠效果,会消耗性能)

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'frosted_class_demo.dart';
  3. void main() => runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "WWTA",
  9. theme: ThemeData(
  10. primarySwatch: Colors.deepOrange
  11. ),
  12. home: Scaffold(
  13. body: FrostedClassDemo(),
  14. ),
  15. );
  16. }
  17. }

frosted_class_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'dart:ui';//图片过滤器时使用的
  3. class FrostedClassDemo extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return Scaffold(
  7. body: Stack(//层叠组件
  8. children: <Widget>[
  9. ConstrainedBox(//约束盒子,添加额外的约束条件
  10. constraints: const BoxConstraints.expand(),//约束条件随着里面的东西扩展
  11. child: Image.network("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F17%2F08%2F31%2Ff63f19162d471a33d20401a6c24b4049.jpg%21%2Ffwfh%2F804x546%2Fquality%2F90%2Funsharp%2Ftrue%2Fcompress%2Ftrue&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618538013&t=7025db3829d5c90648801ecf94cfbe0f"),
  12. ),
  13. Center(
  14. child: ClipRect(//可裁切的矩形
  15. child: BackdropFilter(//背景过滤器
  16. filter: ImageFilter.blur(sigmaX: 5.0,sigmaY: 5.0),//模糊 引用dart:ui的图片过滤器
  17. child: Opacity(//透明度
  18. opacity: 0.5,
  19. child: Container(//设置大小
  20. width: 500.0,
  21. height: 700.0,
  22. decoration: BoxDecoration(color: Colors.green.shade200),//盒子修饰器
  23. child: Center(
  24. child: Text(
  25. "WWTAAAA",
  26. style: Theme.of(context).textTheme.display3,//字的修饰,textTheme字体样式
  27. ),
  28. ),
  29. ),
  30. ),
  31. ),
  32. ),
  33. ),
  34. ],
  35. ),
  36. );
  37. }
  38. }

5.页面跳转保持页面状态

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'keep_alive_demo.dart';
  3. void main() =>runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "保持页面状态",
  9. theme: ThemeData(
  10. primarySwatch: Colors.blue,
  11. ),
  12. home: KeepAliveDemo(),
  13. );
  14. }
  15. }
  16. class KeepAliveDemo extends StatefulWidget {
  17. @override
  18. _KeepAliveDemoState createState() => _KeepAliveDemoState();
  19. }
  20. class _KeepAliveDemoState extends State<KeepAliveDemo> with SingleTickerProviderStateMixin{//with混入SingleTickerProviderStateMixin
  21. TabController _controller;
  22. //重写初始化方法
  23. @override
  24. void initState() {
  25. // TODO: implement initState
  26. super.initState();
  27. _controller=TabController(length: 3, vsync: this);//this来自于SingleTickerProviderStateMixin
  28. }
  29. //重写销毁方法
  30. @override
  31. void dispose() {
  32. // TODO: implement dispose
  33. _controller.dispose();
  34. super.dispose();
  35. }
  36. @override
  37. Widget build(BuildContext context) {
  38. return Scaffold(
  39. appBar: AppBar(
  40. title: Text("Keep Alive Demo"),
  41. bottom: TabBar(
  42. controller: _controller,
  43. tabs: [//标签
  44. Tab(icon: Icon(Icons.home),),
  45. Tab(icon: Icon(Icons.access_alarms),),
  46. Tab(icon: Icon(Icons.directions_bike_sharp),),
  47. ],
  48. ),
  49. ),
  50. body: TabBarView(
  51. controller: _controller,
  52. children: <Widget>[
  53. MyHomePage(),
  54. MyHomePage(),
  55. MyHomePage(),
  56. ],
  57. ),
  58. );
  59. }
  60. }

keep_alive_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. class MyHomePage extends StatefulWidget {
  3. @override
  4. _MyHomePageState createState() => _MyHomePageState();
  5. }
  6. class _MyHomePageState extends State<MyHomePage> with AutomaticKeepAliveClientMixin{
  7. //声明计数器
  8. int _counter=0;
  9. @override
  10. bool get wantKeepAlive =>true;
  11. void _incrementCounter(){
  12. setState(() {//setState改变状态
  13. _counter++;
  14. });
  15. }
  16. @override
  17. Widget build(BuildContext context) {
  18. return Scaffold(
  19. body: Center(
  20. child: Column(
  21. mainAxisAlignment: MainAxisAlignment.center,//居中对齐
  22. children: <Widget>[
  23. Text("点击+1"),
  24. Text(
  25. '$_counter',
  26. style: Theme.of(context).textTheme.bodyText1,//字体样式
  27. )
  28. ],
  29. ),
  30. ),
  31. floatingActionButton: FloatingActionButton(
  32. onPressed: _incrementCounter,
  33. tooltip: '点击+1',//长按提示
  34. child: Icon(Icons.add),
  35. ),
  36. );
  37. }
  38. }

6.搜索栏预选

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'search_dar_demo.dart';
  3. void main() =>runApp(MyApp());
  4. class MyApp extends StatelessWidget {
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. title: "搜索栏的预选",
  9. theme: ThemeData.light(),
  10. home: SearchDarDemo(),
  11. );
  12. }
  13. }

search_dar_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'asset.dart';
  3. class SearchDarDemo extends StatefulWidget {
  4. @override
  5. _SearchDarDemoState createState() => _SearchDarDemoState();
  6. }
  7. class _SearchDarDemoState extends State<SearchDarDemo> {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Scaffold(
  11. appBar: AppBar(
  12. title: Text("搜索条"),
  13. actions: <Widget>[
  14. IconButton(
  15. icon: Icon(Icons.search),
  16. onPressed:(){
  17. showSearch(context: context, delegate: searchBarBelegate());
  18. }
  19. )
  20. ],
  21. ),
  22. );
  23. }
  24. }
  25. class searchBarBelegate extends SearchDelegate<String>{
  26. @override
  27. List<Widget> buildActions(BuildContext context){
  28. return [
  29. IconButton(icon: Icon(Icons.clear), onPressed: ()=>query="")//点一下x,把搜索内容变成空
  30. ];
  31. }
  32. @override
  33. Widget buildLeading(BuildContext context){
  34. return IconButton(
  35. icon: AnimatedIcon(//带动画的标签
  36. icon: AnimatedIcons.menu_arrow,progress: transitionAnimation,
  37. ),
  38. onPressed: ()=>close(context,null),
  39. );
  40. }
  41. @override
  42. Widget buildResults(BuildContext context){
  43. return Container(
  44. width: 100,
  45. height: 100,
  46. child: Card(
  47. color: Colors.pinkAccent,
  48. child: Center(
  49. child: Text(query),
  50. ),
  51. ),
  52. );
  53. }
  54. @override
  55. Widget buildSuggestions(BuildContext context){
  56. //搜索的变量
  57. final _suggestionList=query.isEmpty ? recentSuggest : searchList.where((input) => input.startsWith(query)).toList();
  58. return ListView.builder(
  59. itemCount: _suggestionList.length,
  60. itemBuilder: (context,index)=>ListTile(
  61. title: RichText(//副文本
  62. text: TextSpan(
  63. //字体加黑
  64. text: _suggestionList[index].substring(0,query.length),
  65. style: TextStyle(
  66. color: Colors.black,fontWeight: FontWeight.bold
  67. ),
  68. children:[
  69. TextSpan(
  70. text: _suggestionList[index].substring(query.length),
  71. style: TextStyle(color: Colors.grey)
  72. )
  73. ]
  74. ),
  75. ),
  76. ),
  77. );
  78. }
  79. }

asset.dart文件(模拟后台数据)

  1. //模拟后台数据
  2. const searchList=[
  3. "蒙德-火系-可莉",
  4. "璃玥-火系-香菱",
  5. "璃玥-冰系-甘雨",
  6. "稻妻-冰系-神里"
  7. ];
  8. const recentSuggest=[
  9. "推荐-1",
  10. "推荐-2"
  11. ];

7.Warp流式布局

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'warp_demo.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "Warp流式布局",
  11. theme: ThemeData.light(),
  12. home: WarpDemo(),
  13. );
  14. }
  15. }

warp_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. class WarpDemo extends StatefulWidget {
  3. @override
  4. _WarpDemoState createState() => _WarpDemoState();
  5. }
  6. class _WarpDemoState extends State<WarpDemo> {
  7. List<Widget> list;
  8. @override
  9. void initState() {
  10. // TODO: implement initState
  11. super.initState();
  12. list=List<Widget>()..add(buildAddButton());
  13. }
  14. @override
  15. Widget build(BuildContext context) {
  16. final width=MediaQuery.of(context).size.width;//获取屏幕的宽度
  17. final height=MediaQuery.of(context).size.height;//获取屏幕的高度
  18. return Scaffold(
  19. appBar: AppBar(
  20. title: Text("warp流式布局"),
  21. ),
  22. body: Center(
  23. child: Opacity(
  24. opacity: 0.8,
  25. child: Container(
  26. width: width,
  27. height: height/2,
  28. color: Colors.grey,
  29. child: Wrap(
  30. children: list,
  31. spacing: 26.0,
  32. ),
  33. ),
  34. ),
  35. ),
  36. );
  37. }
  38. Widget buildAddButton(){
  39. //手势识别
  40. return GestureDetector(
  41. onTap: (){
  42. setState(() {//setState状态 一定要加状态
  43. if(list.length<9){
  44. list.insert(list.length-1, buildPhoto());
  45. }
  46. });
  47. },
  48. //黑色的方块+号
  49. child: Padding(
  50. padding: const EdgeInsets.all(8.0),
  51. child: Container(
  52. width: 80.0,
  53. height: 80.0,
  54. color: Colors.black12,
  55. child: Icon(Icons.add),
  56. ),
  57. ),
  58. );
  59. }
  60. //点击之后的框
  61. Widget buildPhoto(){
  62. return Padding(
  63. padding: const EdgeInsets.all(8.0),
  64. child: Container(
  65. width: 80.0,
  66. height: 80.0,
  67. color: Colors.deepOrangeAccent,
  68. child: Center(
  69. child: Text("照片"),
  70. ),
  71. ),
  72. );
  73. }
  74. }

8.展开闭合

ExpansionTile展开闭合

main.dart

  1. import 'package:flutter/material.dart';
  2. import 'expansion_tile_demo.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "展开闭合",
  11. theme: ThemeData.dark(),
  12. home: ExpansionTileDemo(),
  13. );
  14. }
  15. }

expansion_tile_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. class ExpansionTileDemo extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("expansion tile demo"),
  8. ),
  9. body: Center(
  10. child: ExpansionTile(//可扩展小瓦片
  11. title: Text("Expansion Tile"),
  12. //左边图标
  13. leading: Icon(Icons.ac_unit),
  14. backgroundColor: Colors.white12,
  15. children: <Widget>[
  16. ListTile(
  17. title: Text("list tile"),
  18. subtitle: Text("subtitle"),
  19. )
  20. ],
  21. //initiallyExpanded: true, //默认打开状态
  22. ),
  23. ),
  24. );
  25. }
  26. }

ExpansionPaneList(List多个展开闭合)

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'expansion_panel_list.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "展开闭合",
  11. theme: ThemeData.dark(),
  12. home: ExpansionPaneListDemo(),
  13. );
  14. }
  15. }

expansion_panel_list.dart文件

  1. import 'package:flutter/material.dart';
  2. class ExpansionPaneListDemo extends StatefulWidget {
  3. @override
  4. _ExpansionPaneListDemoState createState() => _ExpansionPaneListDemoState();
  5. }
  6. class _ExpansionPaneListDemoState extends State<ExpansionPaneListDemo> {
  7. //元素统计
  8. List<int> mList;
  9. //列表属性
  10. List<ExpandStateBean> expandStateList;
  11. _ExpansionPaneListDemoState(){
  12. mList=new List();
  13. expandStateList=new List();
  14. for(int i=0;i<10;i++){
  15. mList.add(i);
  16. expandStateList.add(ExpandStateBean(i, false));
  17. }
  18. }
  19. _setCurrentIndex(int index,isExpand){
  20. setState(() {
  21. expandStateList.forEach((item) {
  22. if(item.index==index){
  23. item.isOpen=!isExpand;
  24. }
  25. });
  26. });
  27. }
  28. @override
  29. Widget build(BuildContext context) {
  30. return Scaffold(
  31. appBar: AppBar(
  32. title: Text("expansion panel list"),
  33. ),
  34. body: SingleChildScrollView(
  35. child: ExpansionPanelList(
  36. expansionCallback: (index,bol){
  37. _setCurrentIndex(index,bol);
  38. },
  39. children: mList.map((index) {
  40. return ExpansionPanel(headerBuilder: (context,isExpanded){
  41. return ListTile(
  42. title: Text("this is No.$index"),
  43. );
  44. },body: ListTile(
  45. title: Text("expansion NO.$index"),
  46. ),
  47. isExpanded: expandStateList[index].isOpen
  48. );
  49. }).toList(),
  50. ),
  51. ),
  52. );
  53. }
  54. }
  55. //控制打开闭合
  56. class ExpandStateBean{
  57. var isOpen;
  58. var index;
  59. ExpandStateBean(this.index,this.isOpen);
  60. }

9.贝塞尔曲线

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'custom_clipper.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "Flutter demo",
  11. debugShowCheckedModeBanner: false,
  12. theme: ThemeData(
  13. primarySwatch: Colors.blue
  14. ),
  15. home: HomePage(),
  16. );
  17. }
  18. }

custom_clipper.dart文件

  1. import 'package:flutter/material.dart';
  2. class HomePage extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. body: Column(
  7. children: <Widget>[
  8. ClipPath(//路径裁切控件
  9. clipper: BottomClipperTest(),
  10. child: Container(
  11. color: Colors.deepOrangeAccent,
  12. height: 200.0,
  13. ),
  14. )
  15. ],
  16. ),
  17. );
  18. }
  19. }
  20. //单个圆弧形
  21. class BottomClipper extends CustomClipper<Path>{
  22. @override
  23. Path getClip(Size size) {
  24. var path=Path();
  25. path.lineTo(0, 0);
  26. path.lineTo(0, size.height-60);
  27. var firstControlPint = Offset(size.width/2, size.height);
  28. var firstEndPoint = Offset(size.width, size.height-60);
  29. path.quadraticBezierTo(firstControlPint.dx, firstControlPint.dy, firstEndPoint.dx, firstEndPoint.dy);
  30. path.lineTo(size.width, size.height-60);
  31. path.lineTo(size.width, 0);
  32. return path;
  33. }
  34. @override
  35. bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
  36. return false;
  37. }
  38. }
  39. //波浪形
  40. class BottomClipperTest extends CustomClipper<Path>{
  41. @override
  42. Path getClip(Size size) {
  43. var path=Path();
  44. path.lineTo(0, 0);
  45. path.lineTo(0, size.height-60);
  46. var firstControlPint = Offset(size.width/4, size.height);
  47. var firstEndPoint = Offset(size.width/2, size.height-60);
  48. path.quadraticBezierTo(firstControlPint.dx, firstControlPint.dy, firstEndPoint.dx, firstEndPoint.dy);
  49. var firstControlPint2 = Offset(size.width/4*3, size.height-120);
  50. var firstEndPoint2 = Offset(size.width, size.height-60);
  51. path.quadraticBezierTo(firstControlPint2.dx, firstControlPint2.dy, firstEndPoint2.dx, firstEndPoint2.dy);
  52. path.lineTo(size.width, size.height-120);
  53. path.lineTo(size.width, 0);
  54. return path;
  55. }
  56. @override
  57. bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
  58. return false;
  59. }
  60. }

10.app进入动画

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'splash_screen.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "进入APP动画",
  11. theme: ThemeData(
  12. primarySwatch: Colors.blue
  13. ),
  14. home: SplashScreen(),
  15. );
  16. }
  17. }

splash_screen.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'home_page.dart';
  3. class SplashScreen extends StatefulWidget {
  4. @override
  5. _SplashScreenState createState() => _SplashScreenState();
  6. }
  7. class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin{//with混入
  8. AnimationController _controller;//动画控制器
  9. Animation _animation;//动画
  10. @override
  11. void initState() {
  12. super.initState();
  13. _controller=AnimationController(vsync: this,duration: Duration(milliseconds: 3000));//Duration动画时间 milliseconds毫秒
  14. _animation=Tween(begin: 0.0,end: 1.0).animate(_controller);
  15. //动画的监听事件
  16. _animation.addStatusListener((status) {
  17. if(status==AnimationStatus.completed){//如果动画结束
  18. //结束了动画把动画结束然后跳转页面
  19. Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context)=>MyHomePage()), (route) => route==null);
  20. }
  21. });
  22. _controller.forward();//播放动画
  23. }
  24. @override
  25. void dispose() {
  26. _controller.dispose();//删除动画的控制器
  27. super.dispose();
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return FadeTransition(
  32. opacity: _animation,
  33. child: Image.network(
  34. "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F17%2F08%2F31%2Ff63f19162d471a33d20401a6c24b4049.jpg%21%2Ffwfh%2F804x546%2Fquality%2F90%2Funsharp%2Ftrue%2Fcompress%2Ftrue&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618538013&t=7025db3829d5c90648801ecf94cfbe0f",
  35. scale:2.0 ,
  36. fit: BoxFit.cover,
  37. ),
  38. );
  39. }
  40. }

home_page.dart文件

  1. import 'package:flutter/material.dart';
  2. class MyHomePage extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(title: Text("首页"),),
  7. body: Center(child: Text("这里是首页"),),
  8. );
  9. }
  10. }

11.右滑返回上一页

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'right_back_demo.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "右滑返回上一页",
  11. theme: ThemeData(primarySwatch: Colors.pink),
  12. home: RightBackDemo(),
  13. );
  14. }
  15. }

right_back_demo.dart文件

这一个的导包不一样是import ‘package:flutter/cupertino.dart’;

  1. import 'package:flutter/cupertino.dart';//cupertino
  2. class RightBackDemo extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return CupertinoPageScaffold(//CupertinoPageScaffold在cupertino里拿出来的
  6. child: Center(
  7. child: Container(
  8. height: 100,
  9. width: 100,
  10. color: CupertinoColors.activeBlue,
  11. child: CupertinoButton(
  12. child: Icon(CupertinoIcons.add),
  13. onPressed: (){
  14. Navigator.of(context).push(
  15. CupertinoPageRoute(builder: (BuildContext context){
  16. return RightBackDemo();
  17. })
  18. );
  19. },
  20. ),
  21. ),
  22. )
  23. );
  24. }
  25. }

12.轻量级提示ToolTip

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'tool_tip_demo.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "轻量级提醒",
  11. theme: ThemeData.light(),
  12. home: ToolTipDemo(),
  13. );
  14. }
  15. }

tool_tip_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. class ToolTipDemo extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Scaffold(
  6. appBar: AppBar(
  7. title: Text("轻量级提示"),
  8. ),
  9. body: Center(
  10. child: Tooltip(
  11. child: Image.network("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.shu163.com%2Fuploadfiles%2Fsc%2F2010%2F7%2F2010071105574273.jpg&refer=http%3A%2F%2Fimg.shu163.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1618561014&t=45e2c5917fb08269760a9e6882d9d33b"),
  12. message: "这是一个脸谱",
  13. ),
  14. ),
  15. );
  16. }
  17. }

13.Draggable拖拽控件

main.dart文件

  1. import 'package:flutter/material.dart';
  2. import 'draggable_demo.dart';
  3. void main() {
  4. runApp(MyApp());
  5. }
  6. class MyApp extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return MaterialApp(
  10. title: "拖拽控件",
  11. theme: ThemeData(
  12. primarySwatch: Colors.blue
  13. ),
  14. home: DraggableDemo(),
  15. );
  16. }
  17. }

draggable_widget.dart文件

  1. import 'package:flutter/material.dart';
  2. class DraggableWidget extends StatefulWidget {
  3. final Offset offset;
  4. final Color widgetColor;
  5. const DraggableWidget({Key key,this.offset,this.widgetColor}):super(key: key);
  6. @override
  7. _DraggableWidgetState createState() => _DraggableWidgetState();
  8. }
  9. class _DraggableWidgetState extends State<DraggableWidget> {
  10. Offset offset=Offset(0.0, 0.0);
  11. @override
  12. void initState() {
  13. super.initState();
  14. offset=widget.offset;
  15. }
  16. @override
  17. Widget build(BuildContext context) {
  18. return Positioned(
  19. left: offset.dx,
  20. top: offset.dy,
  21. child: Draggable(//拖拽动作
  22. data: widget.widgetColor,//传递拖拽值
  23. child: Container(
  24. width: 100.0,
  25. height: 100.0,
  26. color: widget.widgetColor,
  27. ),
  28. feedback: Container(//当我们拖动时子元素的样子
  29. width: 100.0,
  30. height: 100.0,
  31. color: widget.widgetColor.withOpacity(0.5),//拖动时颜色变浅
  32. ),
  33. onDraggableCanceled: (Velocity velocity,Offset offset){//当我们松手时
  34. setState(() {
  35. this.offset=offset;// this.offset是原来的offset,offset的拖动的
  36. });
  37. },
  38. )
  39. );
  40. }
  41. }

draggable_demo.dart文件

  1. import 'package:flutter/material.dart';
  2. class DraggableWidget extends StatefulWidget {
  3. final Offset offset;
  4. final Color widgetColor;
  5. const DraggableWidget({Key key,this.offset,this.widgetColor}):super(key: key);
  6. @override
  7. _DraggableWidgetState createState() => _DraggableWidgetState();
  8. }
  9. class _DraggableWidgetState extends State<DraggableWidget> {
  10. Offset offset=Offset(0.0, 0.0);
  11. @override
  12. void initState() {
  13. super.initState();
  14. offset=widget.offset;
  15. }
  16. @override
  17. Widget build(BuildContext context) {
  18. return Positioned(
  19. left: offset.dx,
  20. top: offset.dy,
  21. child: Draggable(//拖拽动作
  22. data: widget.widgetColor,//传递拖拽值
  23. child: Container(
  24. width: 100.0,
  25. height: 100.0,
  26. color: widget.widgetColor,
  27. ),
  28. feedback: Container(//当我们拖动时子元素的样子
  29. width: 100.0,
  30. height: 100.0,
  31. color: widget.widgetColor.withOpacity(0.5),//拖动时颜色变浅
  32. ),
  33. onDraggableCanceled: (Velocity velocity,Offset offset){//当我们松手时
  34. setState(() {
  35. this.offset=offset;// this.offset是原来的offset,offset的拖动的
  36. });
  37. },
  38. )
  39. );
  40. }
  41. }