mirror of
https://github.com/alibaba/flutter-go.git
synced 2025-08-06 17:48:43 +08:00
feat(增加免责声明): 声明组件,自动弹出,左上角入口
This commit is contained in:
247
lib/components/disclaimer_msg.dart
Normal file
247
lib/components/disclaimer_msg.dart
Normal 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();
|
||||
});
|
||||
}
|
||||
}
|
@ -184,11 +184,11 @@ class _MyHomePageState extends State<MyHomePage>
|
||||
}
|
||||
}
|
||||
|
||||
// void _onDataChange(val) {
|
||||
// if (this.mounted) {
|
||||
// setState(() {
|
||||
// data = val;
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// void _onDataChange(val) {
|
||||
// if (this.mounted) {
|
||||
// setState(() {
|
||||
// data = val;
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
69
lib/model/collection_general.dart
Normal file
69
lib/model/collection_general.dart
Normal 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');
|
||||
}
|
||||
}
|
@ -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/pagination.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';
|
||||
|
||||
GlobalKey<DisclaimerMsgState> key;
|
||||
|
||||
class FirstPage extends StatefulWidget {
|
||||
@override
|
||||
FirstPageState createState() => new FirstPageState();
|
||||
@ -13,13 +17,52 @@ class FirstPage extends StatefulWidget {
|
||||
|
||||
class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin{
|
||||
|
||||
|
||||
@override
|
||||
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
|
||||
void 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 {
|
||||
@ -52,7 +95,6 @@ class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin
|
||||
var myTitle = '${item.title}';
|
||||
var myUsername = '${'👲'}: ${item.username} ';
|
||||
var codeUrl = '${item.detailUrl}';
|
||||
|
||||
return new ListViewItem(itemUrl:codeUrl,itemTitle: myTitle,data: myUsername,);
|
||||
}
|
||||
|
||||
@ -61,14 +103,21 @@ class FirstPageState extends State<FirstPage> with AutomaticKeepAliveClientMixin
|
||||
super.build(context);
|
||||
return new Column(
|
||||
children: <Widget>[
|
||||
new Container(
|
||||
child: new Pagination(),
|
||||
new Stack(
|
||||
//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)),
|
||||
new Expanded(
|
||||
//child: new List(),
|
||||
child: listComp.ListRefresh(getIndexListData,makeCard)
|
||||
),
|
||||
)
|
||||
]
|
||||
|
||||
);
|
||||
|
@ -34,10 +34,9 @@ const String _CheckboxListTileText2 =
|
||||
"""### **进阶用法**
|
||||
> CheckboxListTile 单选和全选的示例
|
||||
""";
|
||||
|
||||
var valBool = true;
|
||||
class Demo extends StatefulWidget {
|
||||
static const String routeName = '/element/Form/Checkbox/CheckboxListTile';
|
||||
final bool valBool = true;
|
||||
@override
|
||||
_DemoState createState() => _DemoState();
|
||||
}
|
||||
|
Reference in New Issue
Block a user