1.底部导航基础样式
main.dart文件
import 'package:flutter/material.dart';import 'bottome_navigation_widget.dart';void main() =>runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Flutter 底部导航",theme: ThemeData.light(),//默认形态 默认皮肤home: BottomNavigationWidget(),);}}
bottome_navigation_widget.dart文件
import 'package:flutter/material.dart';class BottomNavigationWidget extends StatefulWidget {//动态widget@override_BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();}class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {final _BottomNavigationColor=Colors.blue; //定义颜色@overrideWidget build(BuildContext context) {return Scaffold( //脚手架相对于一个磨具,定义好位置bottomNavigationBar: BottomNavigationBar(items: [BottomNavigationBarItem(icon: Icon(Icons.home,color: _BottomNavigationColor),//设置图标+颜色title: Text("首页",style: TextStyle(color: _BottomNavigationColor),)), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet,color: _BottomNavigationColor),//设置图标+颜色title: Text("钱包",style: TextStyle(color: _BottomNavigationColor),)), BottomNavigationBarItem(icon: Icon(Icons.airplay_sharp,color: _BottomNavigationColor),//设置图标+颜色title: Text("商品",style: TextStyle(color: _BottomNavigationColor),)), BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded,color: _BottomNavigationColor),//设置图标+颜色title: Text("个人中心",style: TextStyle(color: _BottomNavigationColor),)),],),);}}
2.导航栏的跳转
shifting模式(导航栏点进去才显示与图标相关的文本)
main.dart文件
import 'package:flutter/material.dart';import 'bottome_navigation_widget.dart';void main() =>runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Flutter 底部导航",theme: ThemeData.light(),//默认形态 默认皮肤home: BottomNavigationWidget(),);}}
bottome_navigation_widget.dart文件
import 'package:flutter/material.dart';import 'pages/airplay_screen.dart';import 'pages/home_screen.dart';import 'pages/money_screen.dart';import 'pages/pages_screen.dart';class BottomNavigationWidget extends StatefulWidget {//动态widget@override_BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();}class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {final _BottomNavigationColor=Colors.black; //定义颜色int _currentIndex=0;//声明一个索引List<Widget> list=List();@overridevoid initState(){list..add(HomeScreen())..add(MoneyScreen())..add(AirplayScreen())..add(PagesScreen());super.initState();}@overrideWidget build(BuildContext context) {return Scaffold( //脚手架相对于一个磨具,定义好位置body: list[_currentIndex],//屏幕中间的主题bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home,color: _BottomNavigationColor),//设置图标+颜色title: Text("首页",style: TextStyle(color: _BottomNavigationColor),),backgroundColor: Colors.blue,), BottomNavigationBarItem(icon: Icon(Icons.airplay_sharp,color: _BottomNavigationColor),//设置图标+颜色title: Text("商品",style: TextStyle(color: _BottomNavigationColor),),backgroundColor: Colors.amber,), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet,color: _BottomNavigationColor),//设置图标+颜色title: Text("钱包",style: TextStyle(color: _BottomNavigationColor),),backgroundColor: Colors.green,),BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded,color: _BottomNavigationColor),//设置图标+颜色title: Text("个人中心",style: TextStyle(color: _BottomNavigationColor),),backgroundColor: Colors.red,),],currentIndex: _currentIndex,//那个是高亮(被选中)selectedItemColor: Colors.pink,onTap: (int index){ //点击事件添加indexsetState(() {_currentIndex=index;});},),);}}
在lib下创建pages文件夹
home_screen.dart文件
import 'package:flutter/material.dart';class HomeScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("这是首页"),),body: Center(child: Text("首页呀"),),);}}
money_screen.dart文件
import 'package:flutter/material.dart';class MoneyScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("这是钱包"),),body: Center(child: Text("钱包呀"),),);}}
airplay_screen.dart文件
import 'package:flutter/material.dart';class AirplayScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("这是商品"),),body: Center(child: Text("商品"),),);}}
pages_screen.dart文件
import 'package:flutter/material.dart';class PagesScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("这是页"),),body: Center(child: Text("页呀"),),);}}
fixed模式
main.dart文件
import 'package:flutter/material.dart';import 'bottome_navigation_widget.dart';void main() =>runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Flutter 底部导航",theme: ThemeData(primaryColor: Colors.deepOrangeAccent//可修改主题颜色),//默认形态 默认皮肤home: BottomNavigationWidget(),);}}
在bottome_navigation_widget.dart的Widget匿名函数里的bottomNavigationBar里面加入
type: BottomNavigationBarType.fixed,
import 'package:flutter/material.dart';import 'pages/airplay_screen.dart';import 'pages/home_screen.dart';import 'pages/money_screen.dart';import 'pages/pages_screen.dart';class BottomNavigationWidget extends StatefulWidget {//动态widget@override_BottomNavigationWidgetState createState() => _BottomNavigationWidgetState();}class _BottomNavigationWidgetState extends State<BottomNavigationWidget> {final _BottomNavigationColor=Colors.black; //定义颜色int _currentIndex=0;//声明一个索引List<Widget> list=List();@overridevoid initState(){list..add(HomeScreen())..add(MoneyScreen())..add(AirplayScreen())..add(PagesScreen());super.initState();}@overrideWidget build(BuildContext context) {return Scaffold( //脚手架相对于一个磨具,定义好位置body: list[_currentIndex],//屏幕中间的主题bottomNavigationBar: BottomNavigationBar(items: <BottomNavigationBarItem>[BottomNavigationBarItem(icon: Icon(Icons.home),title: Text("首页",),), BottomNavigationBarItem(icon: Icon(Icons.airplay_sharp),title: Text("商品",),), BottomNavigationBarItem(icon: Icon(Icons.account_balance_wallet),title: Text("钱包",),),BottomNavigationBarItem(icon: Icon(Icons.account_box_rounded),title: Text("个人中心",),),],currentIndex: _currentIndex,//那个是高亮(被选中)type: BottomNavigationBarType.fixed,//fixedColor指定的颜色,可以让文本和图标一起显示onTap: (int index){ //点击事件添加indexsetState(() {_currentIndex=index;});},),);}}
不规则导航栏
main.dart文件
import 'package:flutter/material.dart';import 'bottom_appBar_demo.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "不规则导航栏",//自定义主题样本theme: ThemeData(primarySwatch: Colors.lime),home: BottomAppBarDemo(),);}}
bottom_appBar_demo.dart文件
import 'package:flutter/material.dart';import 'each_view.dart';class BottomAppBarDemo extends StatefulWidget {//动态样式@override_BottomAppBarDemoState createState() => _BottomAppBarDemoState();}class _BottomAppBarDemoState extends State<BottomAppBarDemo> {List<Widget> _list;int _index=0;@overridevoid initState() {//初始化状态方法// TODO: implement initStatesuper.initState();_list=List();_list..add(EachView("我是主页"))..add(EachView("我是床"));}@overrideWidget build(BuildContext context) {return Scaffold(body: _list[_index],//可交互浮动按钮FABfloatingActionButton: FloatingActionButton(//响应方式onPressed: (){Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context){return EachView("我是+++");}));},tooltip: "我是长按文字",child: Icon(Icons.add,color: Colors.white,),),floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,bottomNavigationBar: BottomAppBar(//BottomAppBar工具栏color: Colors.lime,shape: CircularNotchedRectangle(),//与floatingActionButton如何时需要一个缺口(CircularNotchedRectangle圆形缺口)child: Row(mainAxisSize: MainAxisSize.max,mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[IconButton(icon: Icon(Icons.home,),color: Colors.white,onPressed: (){setState(() {_index=0;});},),IconButton(icon: Icon(Icons.airline_seat_individual_suite),color: Colors.white,onPressed: (){setState(() {_index=1;});},),],),),);}}
each_view.dart文件
import 'package:flutter/material.dart';class EachView extends StatefulWidget {String _title;EachView(this._title);//获取上一个页面给的参数@override_EachViewState createState() => _EachViewState();}class _EachViewState extends State<EachView> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget._title),),body: Center(child: Text(widget._title),),);}}
3.动画效果
路由跳转动画
main.dart文件
import 'package:flutter/material.dart';import 'pages.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "炫酷导航",//自定义主题样本theme: ThemeData(primarySwatch: Colors.pink),home: FirsPage(),);}}
pages.dart文件
import 'package:flutter/material.dart';import 'custime_router.dart';class FirsPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(backgroundColor: Colors.pink,appBar: AppBar(title: Text("第一页",style: TextStyle(fontSize: 36.0),),//与底部融合elevation: 0.0,),body: Center(child: MaterialButton(child: Icon(Icons.navigate_next,color: Colors.white,size: 64.0,),onPressed: (){Navigator.of(context).push(CustimeRouter(SecondPage()));},),),);}}class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(backgroundColor: Colors.deepPurple,appBar: AppBar(title: Text("第二页",style: TextStyle(fontSize: 36.0),),backgroundColor: Colors.deepPurple,leading: Container(),//与底部融合elevation: 0.0,),body: Center(child: MaterialButton(child: Icon(Icons.navigate_before,color: Colors.white,size: 64.0,),onPressed: (){Navigator.of(context).pop();},),),);}}
custime_router.dart文件
import 'package:flutter/material.dart';class CustimeRouter extends PageRouteBuilder{final Widget widget;//继承父类重写CustimeRouter(this.widget):super(//过度时间transitionDuration: Duration(seconds: 1),pageBuilder: (BuildContext context,Animation<double> animation1,Animation<double> animation2,){return widget;},transitionsBuilder: (BuildContext context,Animation<double> animation1,Animation<double> animation2,Widget child){//渐隐渐先动画/* return FadeTransition(opacity: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),child: child,);*///缩放动画效果/* return ScaleTransition(scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),child: child,);*///旋转加缩放/*return RotationTransition(turns: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),child: ScaleTransition(scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(parent: animation1, curve: Curves.fastOutSlowIn)),child: child,),);*///左右滑动return SlideTransition(position: Tween<Offset>(begin: Offset(-1.0,0.0),end: Offset(0.0,0.0)).animate(CurvedAnimation(parent: animation1, curve: Curves.decelerate)),child: child,);});}
4.磨砂特效(层叠效果,会消耗性能)
main.dart文件
import 'package:flutter/material.dart';import 'frosted_class_demo.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "WWTA",theme: ThemeData(primarySwatch: Colors.deepOrange),home: Scaffold(body: FrostedClassDemo(),),);}}
frosted_class_demo.dart文件
import 'package:flutter/material.dart';import 'dart:ui';//图片过滤器时使用的class FrostedClassDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Stack(//层叠组件children: <Widget>[ConstrainedBox(//约束盒子,添加额外的约束条件constraints: const BoxConstraints.expand(),//约束条件随着里面的东西扩展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"),),Center(child: ClipRect(//可裁切的矩形child: BackdropFilter(//背景过滤器filter: ImageFilter.blur(sigmaX: 5.0,sigmaY: 5.0),//模糊 引用dart:ui的图片过滤器child: Opacity(//透明度opacity: 0.5,child: Container(//设置大小width: 500.0,height: 700.0,decoration: BoxDecoration(color: Colors.green.shade200),//盒子修饰器child: Center(child: Text("WWTAAAA",style: Theme.of(context).textTheme.display3,//字的修饰,textTheme字体样式),),),),),),),],),);}}
5.页面跳转保持页面状态
main.dart文件
import 'package:flutter/material.dart';import 'keep_alive_demo.dart';void main() =>runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "保持页面状态",theme: ThemeData(primarySwatch: Colors.blue,),home: KeepAliveDemo(),);}}class KeepAliveDemo extends StatefulWidget {@override_KeepAliveDemoState createState() => _KeepAliveDemoState();}class _KeepAliveDemoState extends State<KeepAliveDemo> with SingleTickerProviderStateMixin{//with混入SingleTickerProviderStateMixinTabController _controller;//重写初始化方法@overridevoid initState() {// TODO: implement initStatesuper.initState();_controller=TabController(length: 3, vsync: this);//this来自于SingleTickerProviderStateMixin}//重写销毁方法@overridevoid dispose() {// TODO: implement dispose_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Keep Alive Demo"),bottom: TabBar(controller: _controller,tabs: [//标签Tab(icon: Icon(Icons.home),),Tab(icon: Icon(Icons.access_alarms),),Tab(icon: Icon(Icons.directions_bike_sharp),),],),),body: TabBarView(controller: _controller,children: <Widget>[MyHomePage(),MyHomePage(),MyHomePage(),],),);}}
keep_alive_demo.dart文件
import 'package:flutter/material.dart';class MyHomePage extends StatefulWidget {@override_MyHomePageState createState() => _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> with AutomaticKeepAliveClientMixin{//声明计数器int _counter=0;@overridebool get wantKeepAlive =>true;void _incrementCounter(){setState(() {//setState改变状态_counter++;});}@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,//居中对齐children: <Widget>[Text("点击+1"),Text('$_counter',style: Theme.of(context).textTheme.bodyText1,//字体样式)],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: '点击+1',//长按提示child: Icon(Icons.add),),);}}
6.搜索栏预选
main.dart文件
import 'package:flutter/material.dart';import 'search_dar_demo.dart';void main() =>runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "搜索栏的预选",theme: ThemeData.light(),home: SearchDarDemo(),);}}
search_dar_demo.dart文件
import 'package:flutter/material.dart';import 'asset.dart';class SearchDarDemo extends StatefulWidget {@override_SearchDarDemoState createState() => _SearchDarDemoState();}class _SearchDarDemoState extends State<SearchDarDemo> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("搜索条"),actions: <Widget>[IconButton(icon: Icon(Icons.search),onPressed:(){showSearch(context: context, delegate: searchBarBelegate());})],),);}}class searchBarBelegate extends SearchDelegate<String>{@overrideList<Widget> buildActions(BuildContext context){return [IconButton(icon: Icon(Icons.clear), onPressed: ()=>query="")//点一下x,把搜索内容变成空];}@overrideWidget buildLeading(BuildContext context){return IconButton(icon: AnimatedIcon(//带动画的标签icon: AnimatedIcons.menu_arrow,progress: transitionAnimation,),onPressed: ()=>close(context,null),);}@overrideWidget buildResults(BuildContext context){return Container(width: 100,height: 100,child: Card(color: Colors.pinkAccent,child: Center(child: Text(query),),),);}@overrideWidget buildSuggestions(BuildContext context){//搜索的变量final _suggestionList=query.isEmpty ? recentSuggest : searchList.where((input) => input.startsWith(query)).toList();return ListView.builder(itemCount: _suggestionList.length,itemBuilder: (context,index)=>ListTile(title: RichText(//副文本text: TextSpan(//字体加黑text: _suggestionList[index].substring(0,query.length),style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),children:[TextSpan(text: _suggestionList[index].substring(query.length),style: TextStyle(color: Colors.grey))]),),),);}}
asset.dart文件(模拟后台数据)
//模拟后台数据const searchList=["蒙德-火系-可莉","璃玥-火系-香菱","璃玥-冰系-甘雨","稻妻-冰系-神里"];const recentSuggest=["推荐-1","推荐-2"];
7.Warp流式布局
main.dart文件
import 'package:flutter/material.dart';import 'warp_demo.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Warp流式布局",theme: ThemeData.light(),home: WarpDemo(),);}}
warp_demo.dart文件
import 'package:flutter/material.dart';class WarpDemo extends StatefulWidget {@override_WarpDemoState createState() => _WarpDemoState();}class _WarpDemoState extends State<WarpDemo> {List<Widget> list;@overridevoid initState() {// TODO: implement initStatesuper.initState();list=List<Widget>()..add(buildAddButton());}@overrideWidget build(BuildContext context) {final width=MediaQuery.of(context).size.width;//获取屏幕的宽度final height=MediaQuery.of(context).size.height;//获取屏幕的高度return Scaffold(appBar: AppBar(title: Text("warp流式布局"),),body: Center(child: Opacity(opacity: 0.8,child: Container(width: width,height: height/2,color: Colors.grey,child: Wrap(children: list,spacing: 26.0,),),),),);}Widget buildAddButton(){//手势识别return GestureDetector(onTap: (){setState(() {//setState状态 一定要加状态if(list.length<9){list.insert(list.length-1, buildPhoto());}});},//黑色的方块+号child: Padding(padding: const EdgeInsets.all(8.0),child: Container(width: 80.0,height: 80.0,color: Colors.black12,child: Icon(Icons.add),),),);}//点击之后的框Widget buildPhoto(){return Padding(padding: const EdgeInsets.all(8.0),child: Container(width: 80.0,height: 80.0,color: Colors.deepOrangeAccent,child: Center(child: Text("照片"),),),);}}
8.展开闭合
ExpansionTile展开闭合
main.dart
import 'package:flutter/material.dart';import 'expansion_tile_demo.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "展开闭合",theme: ThemeData.dark(),home: ExpansionTileDemo(),);}}
expansion_tile_demo.dart文件
import 'package:flutter/material.dart';class ExpansionTileDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("expansion tile demo"),),body: Center(child: ExpansionTile(//可扩展小瓦片title: Text("Expansion Tile"),//左边图标leading: Icon(Icons.ac_unit),backgroundColor: Colors.white12,children: <Widget>[ListTile(title: Text("list tile"),subtitle: Text("subtitle"),)],//initiallyExpanded: true, //默认打开状态),),);}}
ExpansionPaneList(List多个展开闭合)
main.dart文件
import 'package:flutter/material.dart';import 'expansion_panel_list.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "展开闭合",theme: ThemeData.dark(),home: ExpansionPaneListDemo(),);}}
expansion_panel_list.dart文件
import 'package:flutter/material.dart';class ExpansionPaneListDemo extends StatefulWidget {@override_ExpansionPaneListDemoState createState() => _ExpansionPaneListDemoState();}class _ExpansionPaneListDemoState extends State<ExpansionPaneListDemo> {//元素统计List<int> mList;//列表属性List<ExpandStateBean> expandStateList;_ExpansionPaneListDemoState(){mList=new List();expandStateList=new List();for(int i=0;i<10;i++){mList.add(i);expandStateList.add(ExpandStateBean(i, false));}}_setCurrentIndex(int index,isExpand){setState(() {expandStateList.forEach((item) {if(item.index==index){item.isOpen=!isExpand;}});});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("expansion panel list"),),body: SingleChildScrollView(child: ExpansionPanelList(expansionCallback: (index,bol){_setCurrentIndex(index,bol);},children: mList.map((index) {return ExpansionPanel(headerBuilder: (context,isExpanded){return ListTile(title: Text("this is No.$index"),);},body: ListTile(title: Text("expansion NO.$index"),),isExpanded: expandStateList[index].isOpen);}).toList(),),),);}}//控制打开闭合class ExpandStateBean{var isOpen;var index;ExpandStateBean(this.index,this.isOpen);}
9.贝塞尔曲线
main.dart文件
import 'package:flutter/material.dart';import 'custom_clipper.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Flutter demo",debugShowCheckedModeBanner: false,theme: ThemeData(primarySwatch: Colors.blue),home: HomePage(),);}}
custom_clipper.dart文件
import 'package:flutter/material.dart';class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Column(children: <Widget>[ClipPath(//路径裁切控件clipper: BottomClipperTest(),child: Container(color: Colors.deepOrangeAccent,height: 200.0,),)],),);}}//单个圆弧形class BottomClipper extends CustomClipper<Path>{@overridePath getClip(Size size) {var path=Path();path.lineTo(0, 0);path.lineTo(0, size.height-60);var firstControlPint = Offset(size.width/2, size.height);var firstEndPoint = Offset(size.width, size.height-60);path.quadraticBezierTo(firstControlPint.dx, firstControlPint.dy, firstEndPoint.dx, firstEndPoint.dy);path.lineTo(size.width, size.height-60);path.lineTo(size.width, 0);return path;}@overridebool shouldReclip(covariant CustomClipper<Path> oldClipper) {return false;}}//波浪形class BottomClipperTest extends CustomClipper<Path>{@overridePath getClip(Size size) {var path=Path();path.lineTo(0, 0);path.lineTo(0, size.height-60);var firstControlPint = Offset(size.width/4, size.height);var firstEndPoint = Offset(size.width/2, size.height-60);path.quadraticBezierTo(firstControlPint.dx, firstControlPint.dy, firstEndPoint.dx, firstEndPoint.dy);var firstControlPint2 = Offset(size.width/4*3, size.height-120);var firstEndPoint2 = Offset(size.width, size.height-60);path.quadraticBezierTo(firstControlPint2.dx, firstControlPint2.dy, firstEndPoint2.dx, firstEndPoint2.dy);path.lineTo(size.width, size.height-120);path.lineTo(size.width, 0);return path;}@overridebool shouldReclip(covariant CustomClipper<Path> oldClipper) {return false;}}
10.app进入动画
main.dart文件
import 'package:flutter/material.dart';import 'splash_screen.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "进入APP动画",theme: ThemeData(primarySwatch: Colors.blue),home: SplashScreen(),);}}
splash_screen.dart文件
import 'package:flutter/material.dart';import 'home_page.dart';class SplashScreen extends StatefulWidget {@override_SplashScreenState createState() => _SplashScreenState();}class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin{//with混入AnimationController _controller;//动画控制器Animation _animation;//动画@overridevoid initState() {super.initState();_controller=AnimationController(vsync: this,duration: Duration(milliseconds: 3000));//Duration动画时间 milliseconds毫秒_animation=Tween(begin: 0.0,end: 1.0).animate(_controller);//动画的监听事件_animation.addStatusListener((status) {if(status==AnimationStatus.completed){//如果动画结束//结束了动画把动画结束然后跳转页面Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context)=>MyHomePage()), (route) => route==null);}});_controller.forward();//播放动画}@overridevoid dispose() {_controller.dispose();//删除动画的控制器super.dispose();}@overrideWidget build(BuildContext context) {return FadeTransition(opacity: _animation,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",scale:2.0 ,fit: BoxFit.cover,),);}}
home_page.dart文件
import 'package:flutter/material.dart';class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("首页"),),body: Center(child: Text("这里是首页"),),);}}
11.右滑返回上一页
main.dart文件
import 'package:flutter/material.dart';import 'right_back_demo.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "右滑返回上一页",theme: ThemeData(primarySwatch: Colors.pink),home: RightBackDemo(),);}}
right_back_demo.dart文件
这一个的导包不一样是import ‘package:flutter/cupertino.dart’;
import 'package:flutter/cupertino.dart';//cupertinoclass RightBackDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return CupertinoPageScaffold(//CupertinoPageScaffold在cupertino里拿出来的child: Center(child: Container(height: 100,width: 100,color: CupertinoColors.activeBlue,child: CupertinoButton(child: Icon(CupertinoIcons.add),onPressed: (){Navigator.of(context).push(CupertinoPageRoute(builder: (BuildContext context){return RightBackDemo();}));},),),));}}
12.轻量级提示ToolTip
main.dart文件
import 'package:flutter/material.dart';import 'tool_tip_demo.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "轻量级提醒",theme: ThemeData.light(),home: ToolTipDemo(),);}}
tool_tip_demo.dart文件
import 'package:flutter/material.dart';class ToolTipDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("轻量级提示"),),body: Center(child: Tooltip(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"),message: "这是一个脸谱",),),);}}
13.Draggable拖拽控件
main.dart文件
import 'package:flutter/material.dart';import 'draggable_demo.dart';void main() {runApp(MyApp());}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "拖拽控件",theme: ThemeData(primarySwatch: Colors.blue),home: DraggableDemo(),);}}
draggable_widget.dart文件
import 'package:flutter/material.dart';class DraggableWidget extends StatefulWidget {final Offset offset;final Color widgetColor;const DraggableWidget({Key key,this.offset,this.widgetColor}):super(key: key);@override_DraggableWidgetState createState() => _DraggableWidgetState();}class _DraggableWidgetState extends State<DraggableWidget> {Offset offset=Offset(0.0, 0.0);@overridevoid initState() {super.initState();offset=widget.offset;}@overrideWidget build(BuildContext context) {return Positioned(left: offset.dx,top: offset.dy,child: Draggable(//拖拽动作data: widget.widgetColor,//传递拖拽值child: Container(width: 100.0,height: 100.0,color: widget.widgetColor,),feedback: Container(//当我们拖动时子元素的样子width: 100.0,height: 100.0,color: widget.widgetColor.withOpacity(0.5),//拖动时颜色变浅),onDraggableCanceled: (Velocity velocity,Offset offset){//当我们松手时setState(() {this.offset=offset;// this.offset是原来的offset,offset的拖动的});},));}}
draggable_demo.dart文件
import 'package:flutter/material.dart';class DraggableWidget extends StatefulWidget {final Offset offset;final Color widgetColor;const DraggableWidget({Key key,this.offset,this.widgetColor}):super(key: key);@override_DraggableWidgetState createState() => _DraggableWidgetState();}class _DraggableWidgetState extends State<DraggableWidget> {Offset offset=Offset(0.0, 0.0);@overridevoid initState() {super.initState();offset=widget.offset;}@overrideWidget build(BuildContext context) {return Positioned(left: offset.dx,top: offset.dy,child: Draggable(//拖拽动作data: widget.widgetColor,//传递拖拽值child: Container(width: 100.0,height: 100.0,color: widget.widgetColor,),feedback: Container(//当我们拖动时子元素的样子width: 100.0,height: 100.0,color: widget.widgetColor.withOpacity(0.5),//拖动时颜色变浅),onDraggableCanceled: (Velocity velocity,Offset offset){//当我们松手时setState(() {this.offset=offset;// this.offset是原来的offset,offset的拖动的});},));}}
