feat(增加免责声明): 声明组件,自动弹出,左上角入口

This commit is contained in:
ryan730
2019-01-13 17:41:23 +08:00
parent 9202d60133
commit 7cf8d11fda
5 changed files with 387 additions and 23 deletions

View File

@ -0,0 +1,247 @@
/**
* Created with Android Studio.
* User: 一晟
* Date: 2019/1/12
* Time: 下午9:19
* email: zhu.yan@alibaba-inc.com
*/
import 'package:flutter/material.dart';
//import 'package:flutter_rookie_book/model/collection_general.dart';
//import 'package:flutter_rookie_book/model/collection_general.dart';
const disclaimerText1 = '\r\r\r\r\r\r本APP属于个人的非赢利性开源项目以供开源社区使用凡本APP转载的所有的文章 、图片、音频、视频文件等资料的版权归版权所有人所有本APP采用的非本站原创文章及图片等内容无法一一和版权者联系如果本网所选内容的文章作者及编辑认为其作品不宜上网供大家浏览或不应无偿使用请及时用电子邮件或电话通知我们以迅速采取适当措施避免给双方造成不必要的经济损失。';
const disclaimerText2 = '\n\r\r\r\r\r\r对于已经授权本APP独家使用并提供给本站资料的版权所有人的文章、图片等资料如需转载使用需取得本站和版权所有人的同意。本APP所刊发、转载的文章其版权均归原作者所有如其他媒体、网站或个人从本网下载使用请在转载有关文章时务必尊重该文章的著作权保留本网注明的“稿件来源”并自负版权等法律责任。';
class DisclaimerMsg extends StatefulWidget {
final State pWidget;
DisclaimerMsg({ Key key, this.pWidget }) : super(key: key);
DisclaimerMsgState createState() => DisclaimerMsgState();
}
class DisclaimerMsgState extends State<DisclaimerMsg> {
var _valBool = false;
var _page;
//CollectionControlModel _collectionControl = new CollectionControlModel();
//List<CollectionGeneral> _collectionList = [];
// void init(BuildContext context) {
// Toast.show(context: context, message: "👉 APP免责声明",cb:showAlertDialog);
// }
@override
void initState() {
super.initState();
// _collectionList.clear();
// _collectionControl.getAllCollection().then((resultList) {
// resultList.forEach((item) {
// _collectionList.add(item);
// print('=============db=========${item}');
// });
// });
_page = widget.pWidget;
}
void refs(bool value){
if(this.mounted){
setState(() {
_valBool=value;
_page.save(value);
});
// _collectionControl
// .insert(CollectionGeneral(key: 'disclaimer', values: value.toString()))
// .then((result) {
// print('result2====${result}');
// }
// );
}
}
void showAlertDialog(BuildContext context) {
// new Future.delayed(Duration(seconds: 5)).then((value) {
// Navigator.of(context).pop();
// });
showDialog<void>(
context: context,
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return AlertDialog(
title: Text('免责声明'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text(disclaimerText1),
Text(disclaimerText2),
],
),
),
shape:RoundedRectangleBorder(borderRadius: new BorderRadius.circular(20.0)), // 圆角
actions: <Widget>[
Container(
width: 270,
alignment: Alignment.centerLeft,
padding: new EdgeInsets.fromLTRB(0.0, 0.0, 30.0, 0.0),
child:
Row(
mainAxisAlignment:MainAxisAlignment.spaceAround,
//crossAxisAlignment:CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment:MainAxisAlignment.center,
children: <Widget>[
Checkbox(
activeColor: Theme.of(context).primaryColor,
tristate:false,
value: _valBool,
onChanged: (bool bol) {
refs(bol);
Navigator.of(context).pop(); // here I pop to avoid multiple Dialogs
showAlertDialog(context); //here i call the same function
}
),
Text('不再显示',style:TextStyle(fontSize: 14)),
],
),
new Flexible(
flex: 1,
child: Container(width: 100,)
),
FlatButton(
child: Text('知道了',style:TextStyle(fontSize: 16,color: Colors.white)),
color: Theme.of(context).primaryColor,
onPressed: () {
Navigator.of(context).pop();
},
),
]
// SizedBox(
// width:150,
// height:55,
// child: CheckboxListTile(
// title: Text('不再显示',style:TextStyle(fontSize: 14)),
// controlAffinity: ListTileControlAffinity.leading,
// activeColor: Colors.red,
// value: _valBool,
// onChanged: (bool value) {
// refs(value);
// Navigator.of(context).pop(); // here I pop to avoid multiple Dialogs
// showAlertDialog(context); //here i call the same function
// }
// )
// //secondary: const Icon(Icons.hourglass_empty),
// ),
// Checkbox(
// activeColor: Colors.red,
// tristate:false,
// value: _valBool,
// onChanged: (bool bol) {
// refs(bol);
// Navigator.of(context).pop(); // here I pop to avoid multiple Dialogs
// showAlertDialog(context); //here i call the same function
// }
// ),
// Text('不再显示',style:TextStyle(fontSize: 14)),
// FlatButton(
// child: Text('知道了',style:TextStyle(fontSize: 16,color: Colors.green)),
// onPressed: () {
// Navigator.of(context).pop();
// },
// ),
// ],
)
)],
);
},
);
}
Widget build(BuildContext context) {
return new GestureDetector(
onTap: () {
showAlertDialog(context);
},
child: Stack(
//alignment: const Alignment(1.6, 1.6),
children: [
new Container(
width:90.0,
alignment: Alignment.center,
decoration: new BoxDecoration(
borderRadius:new BorderRadius.horizontal(right: Radius.circular(10)),
color: Colors.black45,
),
child: new Text(
'🔔 免责声明',
style: new TextStyle(
fontSize: 14.0,
//fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
],
)
);
}
Widget build2(BuildContext context) {
return Container(
padding: new EdgeInsets.all(0.0),
alignment:Alignment.centerRight,
child:FlatButton(
//padding: new EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
child: new Text(
'👉 APP免责声明',
style: new TextStyle(
fontSize: 12.0, //textsize
color: Colors.black54, // textcolor
),
),
//color: Theme.of(context).accentColor,
color: Theme.of(context).accentColor,
//elevation: 0.0,//shadow
//splashColor: Colors.blueGrey,
onPressed: () {
showAlertDialog(context);
//Toast.show(context: context, message: "👉 APP免责声明",cb:showAlertDialog);
})
);
}
}
class Toast {
static void show({@required BuildContext context, @required String message,Function cb}) {
//创建一个OverlayEntry对象
OverlayEntry overlayEntry = new OverlayEntry(builder: (context) {
return new Positioned(
top: MediaQuery.of(context).size.height * 0.12,
right:5.0,
child:RaisedButton(
padding: new EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0),
child: new Text(
'👉 APP免责声明',
style: new TextStyle(
fontSize: 14.0, //textsize
color: Colors.black54, // textcolor
),
),
//color: Theme.of(context).accentColor,
color: Colors.red,
//elevation: 0.0,//shadow
//splashColor: Colors.blueGrey,
onPressed: () {
if(cb is Function){
cb(context);
}
})
);
});
//往Overlay中插入插入OverlayEntry
Overlay.of(context).insert(overlayEntry);
new Future.delayed(Duration(seconds: 2)).then((value) {
//overlayEntry.remove();
});
}
}

View File

@ -121,12 +121,12 @@ class _MyHomePageState extends State<MyHomePage>
return list return list
.map((item) => new MaterialSearchResult<String>( .map((item) => new MaterialSearchResult<String>(
value: item.name, value: item.name,
text: item.name, text: item.name,
onTap: () { onTap: () {
onWidgetTap(item, context); onWidgetTap(item, context);
}, },
)) ))
.toList(); .toList();
} else { } else {
return null; return null;
@ -163,7 +163,7 @@ class _MyHomePageState extends State<MyHomePage>
child: new TabBar( child: new TabBar(
controller: controller, controller: controller,
indicatorColor: indicatorColor:
Theme.of(context).primaryColor, //tab标签的下划线颜色 Theme.of(context).primaryColor, //tab标签的下划线颜色
// labelColor: const Color(0xFF000000), // labelColor: const Color(0xFF000000),
indicatorWeight: 3.0, indicatorWeight: 3.0,
labelColor: Theme.of(context).primaryColor, labelColor: Theme.of(context).primaryColor,
@ -184,11 +184,11 @@ class _MyHomePageState extends State<MyHomePage>
} }
} }
// void _onDataChange(val) { // void _onDataChange(val) {
// if (this.mounted) { // if (this.mounted) {
// setState(() { // setState(() {
// data = val; // data = val;
// }); // });
// } // }
// } // }
} }

View File

@ -0,0 +1,69 @@
/**
* Created with Android Studio.
* User: 一晟
* Date: 2019/1/12
* Time: 下午9:19
* email: zhu.yan@alibaba-inc.com
*/
import 'dart:async';
import '../common/sql.dart';
abstract class CollectionInterface {
String get key;
String get values;
}
class CollectionGeneral implements CollectionInterface {
String key;
String values;
CollectionGeneral({this.key, this.values});
factory CollectionGeneral.fromJSON(Map json){
return CollectionGeneral(key: json['name'],values: json['values']);
}
Object toMap() {
return {'key': key, 'values': values};
}
}
class CollectionControlModel {
final String table = 'collectionGeneral';
Sql sql;
CollectionControlModel() {
sql = Sql.setTable(table);
}
// 获取所有的收藏
// 插入新收藏
Future insert(CollectionGeneral collection) {
var result =
sql.insert({'key': collection.key, 'values': collection.values});
return result;
}
// 获取全部的收藏
Future<List<CollectionGeneral>> getAllCollection() async {
List list = await sql.getByCondition();
List<CollectionGeneral> resultList = [];
list.forEach((item){
print(item);
resultList.add(CollectionGeneral.fromJSON(item));
});
return resultList;
}
// 通过收藏名获取router
Future getRouterByName(String key) async {
List list = await sql.getByCondition(conditions: {'key': key});
return list;
}
// 删除
Future deleteByName(String key) async{
return await sql.delete(key,'key');
}
}

View File

@ -4,8 +4,12 @@ import 'package:flutter_rookie_book/common/list_view_item.dart';
import 'package:flutter_rookie_book/components/list_refresh.dart' as listComp; import 'package:flutter_rookie_book/components/list_refresh.dart' as listComp;
import 'package:flutter_rookie_book/components/pagination.dart'; import 'package:flutter_rookie_book/components/pagination.dart';
import 'package:flutter_rookie_book/components/first_page_item.dart'; import 'package:flutter_rookie_book/components/first_page_item.dart';
import 'package:flutter_rookie_book/components/disclaimer_msg.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../common/net_utils.dart'; import '../common/net_utils.dart';
GlobalKey<DisclaimerMsgState> key;
class FirstPage extends StatefulWidget { class FirstPage extends StatefulWidget {
@override @override
FirstPageState createState() => new FirstPageState(); FirstPageState createState() => new FirstPageState();
@ -13,13 +17,52 @@ class FirstPage extends StatefulWidget {
class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin{ class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin{
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
save(bool flag) async{
//print('=============save=========$flag');
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('disclaimer', flag.toString());
}
Future<String> get() async {
var value;
SharedPreferences prefs = await SharedPreferences.getInstance();
value = prefs.getString('disclaimer');
return value;
}
@override @override
void initState() { void initState() {
super.initState(); super.initState();
if(key == null) {
//print('=============111=========${key}');
delayed();
}
key = GlobalKey<DisclaimerMsgState>();
}
/*
* 判断是否需要弹出免责声明,已经勾选过不在显示,就不会主动弹
* */
Future delayed() async {
await new Future.delayed(const Duration(seconds: 1));
// if (this.mounted) {
// setState(() {
// print('test=======>${key.currentState}');
// key.currentState.showAlertDialog(context);
// //key.currentState.init(context);
// });
// }
Future<String> flag = get();
flag.then((String value) {
//print('=============get=========$value');
if(value.toString() == 'false'){ // 如果没有勾选下次开启
key.currentState.showAlertDialog(context);
}
});
} }
Future<Map> getIndexListData([Map<String, dynamic> params]) async { Future<Map> getIndexListData([Map<String, dynamic> params]) async {
@ -52,7 +95,6 @@ class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin
var myTitle = '${item.title}'; var myTitle = '${item.title}';
var myUsername = '${'👲'}: ${item.username} '; var myUsername = '${'👲'}: ${item.username} ';
var codeUrl = '${item.detailUrl}'; var codeUrl = '${item.detailUrl}';
return new ListViewItem(itemUrl:codeUrl,itemTitle: myTitle,data: myUsername,); return new ListViewItem(itemUrl:codeUrl,itemTitle: myTitle,data: myUsername,);
} }
@ -61,14 +103,21 @@ class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin
super.build(context); super.build(context);
return new Column( return new Column(
children: <Widget>[ children: <Widget>[
new Container( new Stack(
child: new Pagination(), //alignment: const FractionalOffset(0.9, 0.1),//方法一
), children: <Widget>[
Pagination(),
Positioned(//方法二
top: 10.0,
left: 0.0,
child: DisclaimerMsg(key:key,pWidget:this)
),
]),
SizedBox(height: 2, child:Container(color: Theme.of(context).primaryColor)), SizedBox(height: 2, child:Container(color: Theme.of(context).primaryColor)),
new Expanded( new Expanded(
//child: new List(), //child: new List(),
child: listComp.ListRefresh(getIndexListData,makeCard) child: listComp.ListRefresh(getIndexListData,makeCard)
), )
] ]
); );

View File

@ -34,10 +34,9 @@ const String _CheckboxListTileText2 =
"""### **进阶用法** """### **进阶用法**
> CheckboxListTile 单选和全选的示例 > CheckboxListTile 单选和全选的示例
"""; """;
var valBool = true;
class Demo extends StatefulWidget { class Demo extends StatefulWidget {
static const String routeName = '/element/Form/Checkbox/CheckboxListTile'; static const String routeName = '/element/Form/Checkbox/CheckboxListTile';
final bool valBool = true;
@override @override
_DemoState createState() => _DemoState(); _DemoState createState() => _DemoState();
} }