1.底部导航基础样式
main.dart文件
import 'package:flutter/material.dart';
import 'bottome_navigation_widget.dart';
void main() =>runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget 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; //定义颜色
@override
Widget 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 {
@override
Widget 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();
@override
void initState(){
list
..add(HomeScreen())
..add(MoneyScreen())
..add(AirplayScreen())
..add(PagesScreen());
super.initState();
}
@override
Widget 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){ //点击事件添加index
setState(() {
_currentIndex=index;
});
},
),
);
}
}
在lib下创建pages文件夹
home_screen.dart文件
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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();
@override
void initState(){
list
..add(HomeScreen())
..add(MoneyScreen())
..add(AirplayScreen())
..add(PagesScreen());
super.initState();
}
@override
Widget 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){ //点击事件添加index
setState(() {
_currentIndex=index;
});
},
),
);
}
}
不规则导航栏
main.dart文件
import 'package:flutter/material.dart';
import 'bottom_appBar_demo.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget 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;
@override
void initState() {//初始化状态方法
// TODO: implement initState
super.initState();
_list=List();
_list..add(EachView("我是主页"))..add(EachView("我是床"));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _list[_index],
//可交互浮动按钮FAB
floatingActionButton: 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> {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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混入SingleTickerProviderStateMixin
TabController _controller;
//重写初始化方法
@override
void initState() {
// TODO: implement initState
super.initState();
_controller=TabController(length: 3, vsync: this);//this来自于SingleTickerProviderStateMixin
}
//重写销毁方法
@override
void dispose() {
// TODO: implement dispose
_controller.dispose();
super.dispose();
}
@override
Widget 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;
@override
bool get wantKeepAlive =>true;
void _incrementCounter(){
setState(() {//setState改变状态
_counter++;
});
}
@override
Widget 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 {
@override
Widget 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> {
@override
Widget 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>{
@override
List<Widget> buildActions(BuildContext context){
return [
IconButton(icon: Icon(Icons.clear), onPressed: ()=>query="")//点一下x,把搜索内容变成空
];
}
@override
Widget buildLeading(BuildContext context){
return IconButton(
icon: AnimatedIcon(//带动画的标签
icon: AnimatedIcons.menu_arrow,progress: transitionAnimation,
),
onPressed: ()=>close(context,null),
);
}
@override
Widget buildResults(BuildContext context){
return Container(
width: 100,
height: 100,
child: Card(
color: Colors.pinkAccent,
child: Center(
child: Text(query),
),
),
);
}
@override
Widget 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 {
@override
Widget 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;
@override
void initState() {
// TODO: implement initState
super.initState();
list=List<Widget>()..add(buildAddButton());
}
@override
Widget 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 {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "展开闭合",
theme: ThemeData.dark(),
home: ExpansionTileDemo(),
);
}
}
expansion_tile_demo.dart文件
import 'package:flutter/material.dart';
class ExpansionTileDemo extends StatelessWidget {
@override
Widget 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 {
@override
Widget 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;
}
});
});
}
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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>{
@override
Path 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;
}
@override
bool shouldReclip(covariant CustomClipper<Path> oldClipper) {
return false;
}
}
//波浪形
class BottomClipperTest extends CustomClipper<Path>{
@override
Path 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;
}
@override
bool 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 {
@override
Widget 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;//动画
@override
void 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();//播放动画
}
@override
void dispose() {
_controller.dispose();//删除动画的控制器
super.dispose();
}
@override
Widget 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 {
@override
Widget 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 {
@override
Widget 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';//cupertino
class RightBackDemo extends StatelessWidget {
@override
Widget 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 {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "轻量级提醒",
theme: ThemeData.light(),
home: ToolTipDemo(),
);
}
}
tool_tip_demo.dart文件
import 'package:flutter/material.dart';
class ToolTipDemo extends StatelessWidget {
@override
Widget 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 {
@override
Widget 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);
@override
void initState() {
super.initState();
offset=widget.offset;
}
@override
Widget 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);
@override
void initState() {
super.initState();
offset=widget.offset;
}
@override
Widget 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的拖动的
});
},
)
);
}
}