自定义触摸回调组件
- 定义组件所包含的子组件
- 定义背景触摸颜色
- 定义点击事件
import 'package:flutter/material.dart';
class TouchCallBack extends StatefulWidget{
final Widget child;
final VoidCallback onPressed;
final bool isfeed;
final Color background;
TouchCallBack({Key key,
@required this.child,
@required this.onPressed,
this.isfeed:true,
this.background:const Color(0xffd8d8d8),
}):super(key:key);
@override
TouchState createState() => TouchState();
}
class TouchState extends State<TouchCallBack>{
Color color = Colors.transparent;
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Container(
color: color,
child: widget.child,
),
onTap: widget.onPressed,
onPanDown: (d){
if(widget.isfeed == false) return;
setState(() {
color = widget.background;
});
},
onPanCancel: (){
setState(() {
color = Colors.transparent;
});
},
);
}
}
自定义个人页item样式组件
- 定义组件所包含的属性(标题,图片或者图标)
- 定义点击回调事件
- 定义dialog
- 添加路由跳转到网页
import 'package:flutter/material.dart';
import './touch_callback.dart';
class ImItem extends StatelessWidget{
final String title;
final String imagePath;
final Icon icon;
ImItem({Key key,@required this.title,this.imagePath,this.icon}):super(key:key);
@override
Widget build(BuildContext context) {
return TouchCallBack(
onPressed: (){
switch(title){
case 'flutter官网':
Navigator.pushNamed(context, '/flutter');
break;
case '清理缓存':
showAlertDialog(context,"确认清理吗?");
break;
case '退出登录':
showAlertDialog(context,"确认退出吗?");
break;
}
},
child: Container(
height: 50.0,
child: Row(
children: <Widget>[
Container(
child: imagePath != null
? Image.asset(
imagePath,
width: 32.0,
height: 32.0,
)
: SizedBox(
height: 32.0,
width: 32.0,
child: icon,
),
margin: const EdgeInsets.only(left: 22.0,right: 20.0),
),
Text(
title,
style: TextStyle(fontSize: 16.0,color: Color(0xFF353535)),
),
],
),
),
);
}
void showAlertDialog(BuildContext context,String title) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Center(
child: Text(
title,
style: TextStyle(
color: Colors.black,
fontSize: 20.0,
fontWeight: FontWeight.bold),
),
),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("确定",style: TextStyle(color: Colors.lightBlue),),
),
FlatButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("取消",style: TextStyle(color: Colors.lightBlue),),
)
],
);
});
}
}
routes: {
'LoginPage': (BuildContext context) => LoginPage(),
'RegisterPage': (BuildContext context) => RegisterPage(),
'AppPage': (BuildContext context) => AppPage(),
'/flutter': (_) => new WebviewScaffold(
url: "https://flutter.io/",
appBar: new AppBar(
title: new Text("Flutter官网"),
),
withZoom: true,
withLocalStorage: true,
),
},
个人页面
- 定义组件所包含的属性(标题,图片或者图标)
- 定义点击回调事件
- 定义dialog
强调文本
import 'package:flutter/material.dart';
import '../common/touch_callback.dart';
import '../common/im_item.dart';
class MePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
Container(
margin: const EdgeInsets.only(top: 20.0),
color: Colors.white,
height: 80.0,
child: TouchCallBack(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
margin: const EdgeInsets.only(left: 12.0, right: 15.0),
child: CircleAvatar(
backgroundImage: AssetImage('assets/images/home.png'),
maxRadius: 30,
),
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'DoctorWei',
style: TextStyle(
fontSize: 18.0,
color: Color(0xFF353535),
),
),
Text(
'邮箱: 1348172474@qq.com',
style: TextStyle(
fontSize: 14.0,
color: Color(0xFFa9a9a9),
),
),
],
),
),
Container(
margin: const EdgeInsets.only(left: 12.0, right: 15.0),
child: Image.asset(
'assets/images/code.png',
width: 24.0,
height: 24.0,
),
),
],
),
onPressed: () {},
),
),
Container(
margin: const EdgeInsets.only(top: 20.0),
color: Colors.white,
child: ImItem(
title: 'flutter官网',
imagePath: 'assets/images/icon_me_friends.png',
),
),
Container(
margin: const EdgeInsets.only(top: 20.0),
color: Colors.white,
child: Column(
children: <Widget>[
ImItem(
imagePath: 'assets/images/icon_me_message.png',
title: '消息管理',
),
Padding(
padding: const EdgeInsets.only(left: 15.0, right: 15.0),
child: Divider(
height: 0.5,
color: Color(0xFFd9d9d9),
),
),
ImItem(
imagePath: 'assets/images/icon_me_photo.png',
title: '我的相册',
),
Padding(
padding: const EdgeInsets.only(left: 15.0, right: 15.0),
child: Divider(
height: 0.5,
color: Color(0xFFd9d9d9),
),
),
ImItem(
imagePath: 'assets/images/icon_me_file.png',
title: '我的文件',
),
Padding(
padding: const EdgeInsets.only(left: 15.0, right: 15.0),
child: Divider(
height: 0.5,
color: Color(0xFFd9d9d9),
),
),
ImItem(
imagePath: 'assets/images/icon_me_service.png',
title: '联系客服',
),
],
),
),
Container(
margin: const EdgeInsets.only(top: 20.0),
color: Colors.white,
child: ImItem(
title: '清理缓存',
imagePath: 'assets/images/icon_me_clear.png',
),
),
Container(
margin: const EdgeInsets.only(top: 20.0),
color: Colors.white,
child: ImItem(
title: '退出登录',
imagePath: 'assets/images/ic_arrow_back.png',
),
),
],
),
);
}
}