@@ -650,7 +650,7 @@ | |||||
"languageVersion": "2.8" | "languageVersion": "2.8" | ||||
} | } | ||||
], | ], | ||||
"generated": "2020-11-16T05:49:00.255241Z", | |||||
"generated": "2020-11-16T07:14:17.614805Z", | |||||
"generator": "pub", | "generator": "pub", | ||||
"generatorVersion": "2.8.2" | "generatorVersion": "2.8.2" | ||||
} | } |
@@ -3,6 +3,27 @@ | |||||
xmlns:tools="http://schemas.android.com/tools" | xmlns:tools="http://schemas.android.com/tools" | ||||
package="cn.zhios.zhiying_base_widget_example"> | package="cn.zhios.zhiying_base_widget_example"> | ||||
<!-- 网络 状态变化等信息 --> | |||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | |||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |||||
<!-- IMEI等基础信息 --> | |||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> | |||||
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" /> | |||||
<!-- 授权 发现jd app --> | |||||
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> | |||||
<!-- 静态化资源 --> | |||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | |||||
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> | |||||
<uses-permission android:name="android.permission.CAMERA" /> | |||||
<!-- 相机 --> | |||||
<uses-feature android:name="android.hardware.camera" /> | |||||
<uses-feature android:name="android.hardware.camera.autofocus" /> | |||||
<application | <application | ||||
android:name="io.flutter.app.FlutterApplication" | android:name="io.flutter.app.FlutterApplication" | ||||
android:icon="@mipmap/ic_launcher" | android:icon="@mipmap/ic_launcher" | ||||
@@ -1,9 +1,9 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
<DevInfor> | <DevInfor> | ||||
<SinaWeibo Enable="false" /> | |||||
<SinaWeibo Enable="true" /> | |||||
<TencentWeibo Enable="false" /> | <TencentWeibo Enable="false" /> | ||||
<Douban Enable="false" /> | <Douban Enable="false" /> | ||||
<QZone Enable="false" /> | |||||
<QZone Enable="true" /> | |||||
<Renren Enable="false" /> | <Renren Enable="false" /> | ||||
<KaiXin Enable="false" /> | <KaiXin Enable="false" /> | ||||
<Facebook Enable="false" /> | <Facebook Enable="false" /> | ||||
@@ -17,7 +17,7 @@ | |||||
<Email Enable="false" /> | <Email Enable="false" /> | ||||
<ShortMessage Enable="false" /> | <ShortMessage Enable="false" /> | ||||
<Wechat Enable="false" /> | <Wechat Enable="false" /> | ||||
<WechatMoments Enable="false" /> | |||||
<WechatMoments Enable="true" /> | |||||
<QQ AppId="1111030588" AppKey="XoHKlrBybXy7ORBt" ShareByAppClient="true" BypassApproval="false" Enable="true" /> | <QQ AppId="1111030588" AppKey="XoHKlrBybXy7ORBt" ShareByAppClient="true" BypassApproval="false" Enable="true" /> | ||||
<Instapaper Enable="false" /> | <Instapaper Enable="false" /> | ||||
<Pocket Enable="false" /> | <Pocket Enable="false" /> | ||||
@@ -26,7 +26,7 @@ | |||||
<Flickr Enable="false" /> | <Flickr Enable="false" /> | ||||
<Dropbox Enable="false" /> | <Dropbox Enable="false" /> | ||||
<VKontakte Enable="false" /> | <VKontakte Enable="false" /> | ||||
<WechatFavorite Enable="false" /> | |||||
<WechatFavorite Enable="true" /> | |||||
<Yixin Enable="false" /> | <Yixin Enable="false" /> | ||||
<YixinMoments Enable="false" /> | <YixinMoments Enable="false" /> | ||||
<Mingdao Enable="false" /> | <Mingdao Enable="false" /> | ||||
@@ -54,6 +54,7 @@ | |||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
9F04BF67255F882600C4594E /* JDSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JDSDK.bundle; sourceTree = "<group>"; }; | 9F04BF67255F882600C4594E /* JDSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JDSDK.bundle; sourceTree = "<group>"; }; | ||||
9F2FEDAD2520C194002374CF /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | 9F2FEDAD2520C194002374CF /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | ||||
9F5F7EA525626514009BD779 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; }; | |||||
9FFCE2F7251ADE0600F4F353 /* yw_1222_baichuan.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = yw_1222_baichuan.jpg; sourceTree = "<group>"; }; | 9FFCE2F7251ADE0600F4F353 /* yw_1222_baichuan.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = yw_1222_baichuan.jpg; sourceTree = "<group>"; }; | ||||
9FFCE2FB251ADE0600F4F353 /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = "<group>"; }; | 9FFCE2FB251ADE0600F4F353 /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = "<group>"; }; | ||||
9FFCE2FC251ADE0600F4F353 /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = "<group>"; }; | 9FFCE2FC251ADE0600F4F353 /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = "<group>"; }; | ||||
@@ -120,6 +121,7 @@ | |||||
97C146F01CF9000F007C117D /* Runner */ = { | 97C146F01CF9000F007C117D /* Runner */ = { | ||||
isa = PBXGroup; | isa = PBXGroup; | ||||
children = ( | children = ( | ||||
9F5F7EA525626514009BD779 /* Runner.entitlements */, | |||||
9FFCE2F3251ADE0600F4F353 /* 项目资源 */, | 9FFCE2F3251ADE0600F4F353 /* 项目资源 */, | ||||
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, | ||||
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, | ||||
@@ -442,6 +444,7 @@ | |||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ||||
CLANG_ENABLE_MODULES = YES; | CLANG_ENABLE_MODULES = YES; | ||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | |||||
CODE_SIGN_STYLE = Manual; | CODE_SIGN_STYLE = Manual; | ||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
DEVELOPMENT_TEAM = 3EC5G67BTK; | DEVELOPMENT_TEAM = 3EC5G67BTK; | ||||
@@ -581,6 +584,7 @@ | |||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ||||
CLANG_ENABLE_MODULES = YES; | CLANG_ENABLE_MODULES = YES; | ||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | |||||
CODE_SIGN_STYLE = Manual; | CODE_SIGN_STYLE = Manual; | ||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
DEVELOPMENT_TEAM = 3EC5G67BTK; | DEVELOPMENT_TEAM = 3EC5G67BTK; | ||||
@@ -614,6 +618,7 @@ | |||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; | ||||
CLANG_ENABLE_MODULES = YES; | CLANG_ENABLE_MODULES = YES; | ||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | |||||
CODE_SIGN_STYLE = Manual; | CODE_SIGN_STYLE = Manual; | ||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
DEVELOPMENT_TEAM = 3EC5G67BTK; | DEVELOPMENT_TEAM = 3EC5G67BTK; | ||||
@@ -0,0 +1,8 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>aps-environment</key> | |||||
<string>development</string> | |||||
</dict> | |||||
</plist> |
@@ -1,6 +1,8 @@ | |||||
import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:permission_handler/permission_handler.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class NotificationSettingDialog extends StatefulWidget { | class NotificationSettingDialog extends StatefulWidget { | ||||
@override | @override | ||||
@@ -27,52 +29,147 @@ class _NotificationSettingDialogContainerState | |||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return Scaffold( | return Scaffold( | ||||
backgroundColor: Colors.transparent, | backgroundColor: Colors.transparent, | ||||
body: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.center, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
body: Container( | |||||
width: double.infinity, | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.center, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | |||||
Container( | |||||
width: 280, | |||||
// height: 382, | |||||
decoration: BoxDecoration( | |||||
color: Colors.white, | |||||
borderRadius: BorderRadius.circular(10), | |||||
), | |||||
child: Column( | |||||
children: <Widget>[ | |||||
ClipRRect( | |||||
borderRadius: BorderRadius.only( | |||||
topLeft: Radius.circular(10), | |||||
topRight: Radius.circular(10)), | |||||
child: CachedNetworkImage( | |||||
imageUrl: | |||||
'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1456601714,1347673110&fm=26&gp=0.jpg', | |||||
), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.all(8.0), | |||||
child: Text( | |||||
'开启推送通知', | |||||
style: TextStyle( | |||||
fontSize: 16, | |||||
fontWeight: FontWeight.bold, | |||||
color: HexColor.fromHex('#F94400'), | |||||
), | |||||
), | |||||
), | |||||
Padding( | |||||
padding: | |||||
const EdgeInsets.only(left: 8.0, right: 8.0, bottom: 4), | |||||
child: Text( | |||||
'接收服务提醒', | |||||
style: TextStyle( | |||||
fontSize: 13, | |||||
fontWeight: FontWeight.normal, | |||||
color: HexColor.fromHex('#F94400'), | |||||
), | |||||
), | |||||
), | |||||
_createItem(), | |||||
_createItem(), | |||||
_createItem(), | |||||
GestureDetector( | |||||
onTap: () async { | |||||
// 检查并请求权限 | |||||
PermissionStatus status = | |||||
await Permission.notification.request(); | |||||
if (status == PermissionStatus.denied) { | |||||
await openAppSettings(); | |||||
} else if (status != PermissionStatus.granted) { | |||||
status = await Permission.notification.request(); | |||||
} | |||||
// if (status == PermissionStatus.denied) { | |||||
// Fluttertoast.showToast(msg: '暂无权限'); | |||||
// return null; | |||||
// } | |||||
Navigator.pop(context); | |||||
return true; | |||||
}, | |||||
child: Container( | |||||
margin: EdgeInsets.only(top: 10, bottom: 20), | |||||
width: 120, | |||||
height: 30, | |||||
decoration: BoxDecoration( | |||||
color: Colors.redAccent, | |||||
borderRadius: BorderRadius.circular(15), | |||||
), | |||||
), | |||||
) | |||||
], | |||||
), | |||||
), | |||||
GestureDetector( | |||||
child: Container( | |||||
width: 30, | |||||
height: 30, | |||||
margin: EdgeInsets.only(top: 10), | |||||
decoration: BoxDecoration( | |||||
color: Color(0x70606060), | |||||
borderRadius: BorderRadius.circular(15), | |||||
), | |||||
child: Center( | |||||
child: Icon( | |||||
Icons.close, | |||||
color: Colors.white, | |||||
), | |||||
), | |||||
), | |||||
onTap: () { | |||||
Navigator.pop(context); | |||||
}, | |||||
) | |||||
], | |||||
), | |||||
), | |||||
); | |||||
} | |||||
Widget _createItem() { | |||||
return Padding( | |||||
padding: EdgeInsets.only(left: 30, right: 30, top: 4, bottom: 4), | |||||
child: Row( | |||||
mainAxisAlignment: MainAxisAlignment.start, | |||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
Container( | Container( | ||||
width: 280, | |||||
// height: 382, | |||||
decoration: BoxDecoration( | |||||
color: Colors.white, | |||||
borderRadius: BorderRadius.circular(10), | |||||
), | |||||
margin: EdgeInsets.only(right: 6, top: 2), | |||||
width: 20, | |||||
height: 20, | |||||
color: Colors.redAccent, | |||||
), | |||||
Expanded( | |||||
child: Column( | child: Column( | ||||
crossAxisAlignment: CrossAxisAlignment.start, | |||||
children: <Widget>[ | children: <Widget>[ | ||||
ClipRRect( | |||||
borderRadius: BorderRadius.only( | |||||
topLeft: Radius.circular(10), | |||||
topRight: Radius.circular(10)), | |||||
child: CachedNetworkImage( | |||||
imageUrl: | |||||
'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1456601714,1347673110&fm=26&gp=0.jpg', | |||||
Text( | |||||
'补贴到账通知', | |||||
style: TextStyle( | |||||
fontSize: 14, | |||||
fontWeight: FontWeight.bold, | |||||
color: HexColor.fromHex('#333333'), | |||||
), | ), | ||||
), | ), | ||||
Text('开启推送通知'), | |||||
], | |||||
), | |||||
), | |||||
GestureDetector( | |||||
child: Container( | |||||
width: 30, | |||||
height: 30, | |||||
margin: EdgeInsets.only(top: 10), | |||||
decoration: BoxDecoration( | |||||
color: Color(0x70606060), | |||||
borderRadius: BorderRadius.circular(15), | |||||
), | |||||
child: Center( | |||||
child: Icon( | |||||
Icons.close, | |||||
color: Colors.white, | |||||
Text( | |||||
'定时为您推荐热门内容, 不再错过好货', | |||||
style: TextStyle( | |||||
fontSize: 11, | |||||
fontWeight: FontWeight.normal, | |||||
color: HexColor.fromHex('#999999'), | |||||
), | |||||
), | ), | ||||
), | |||||
], | |||||
), | ), | ||||
onTap: () { | |||||
Navigator.pop(context); | |||||
}, | |||||
) | ) | ||||
], | ], | ||||
), | ), | ||||
@@ -0,0 +1,81 @@ | |||||
import 'package:flutter/material.dart'; | |||||
class PolicyConfirmDialog extends StatefulWidget { | |||||
@override | |||||
_PolicyConfirmDialogState createState() => _PolicyConfirmDialogState(); | |||||
} | |||||
class _PolicyConfirmDialogState extends State<PolicyConfirmDialog> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return _PolicyConfirmDialogContainer(); | |||||
} | |||||
} | |||||
class _PolicyConfirmDialogContainer extends StatefulWidget { | |||||
@override | |||||
_PolicyConfirmDialogContainerState createState() => | |||||
_PolicyConfirmDialogContainerState(); | |||||
} | |||||
class _PolicyConfirmDialogContainerState | |||||
extends State<_PolicyConfirmDialogContainer> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Scaffold( | |||||
backgroundColor: Colors.transparent, | |||||
body: Center( | |||||
child: UnconstrainedBox( | |||||
child: Container( | |||||
padding: EdgeInsets.all(15), | |||||
width: 290, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(13), color: Colors.white), | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Text( | |||||
'温馨提示', | |||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), | |||||
child: Text('若得不到您的同意,我们将无法继续为您服务哦,您要不要在想想?'), | |||||
), | |||||
Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: GestureDetector( | |||||
onTap: () { | |||||
Navigator.pop(context, false); | |||||
}, | |||||
child: Container( | |||||
height: 36, | |||||
color: Colors.redAccent, | |||||
child: Text('仍不同意'), | |||||
), | |||||
), | |||||
), | |||||
Container( | |||||
width: 30, | |||||
), | |||||
Expanded( | |||||
child: GestureDetector( | |||||
onTap: () { | |||||
Navigator.pop(context, true); | |||||
}, | |||||
child: Container( | |||||
height: 36, | |||||
color: Colors.redAccent, | |||||
), | |||||
), | |||||
) | |||||
], | |||||
) | |||||
], | |||||
), | |||||
), | |||||
), | |||||
), | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,128 @@ | |||||
import 'package:flutter/gestures.dart'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class PolicyDialog extends StatefulWidget { | |||||
@override | |||||
_PolicyDialogState createState() => _PolicyDialogState(); | |||||
} | |||||
class _PolicyDialogState extends State<PolicyDialog> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return _PolicyDialogContainer(); | |||||
} | |||||
} | |||||
class _PolicyDialogContainer extends StatefulWidget { | |||||
@override | |||||
_PolicyDialogContainerState createState() => _PolicyDialogContainerState(); | |||||
} | |||||
class _PolicyDialogContainerState extends State<_PolicyDialogContainer> { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Scaffold( | |||||
backgroundColor: Colors.transparent, | |||||
body: Center( | |||||
child: Container( | |||||
padding: EdgeInsets.all(15), | |||||
width: 290, | |||||
height: 360, | |||||
decoration: BoxDecoration( | |||||
borderRadius: BorderRadius.circular(13), color: Colors.white), | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Text( | |||||
'温馨提示', | |||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), | |||||
), | |||||
Expanded( | |||||
child: Padding( | |||||
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), | |||||
child: SingleChildScrollView( | |||||
child: _createText(), | |||||
), | |||||
), | |||||
), | |||||
Row( | |||||
children: <Widget>[ | |||||
Expanded( | |||||
child: GestureDetector( | |||||
onTap: () { | |||||
Navigator.pop(context, false); | |||||
}, | |||||
child: Container( | |||||
height: 36, | |||||
color: Colors.redAccent, | |||||
), | |||||
), | |||||
), | |||||
Container( | |||||
width: 30, | |||||
), | |||||
Expanded( | |||||
child: GestureDetector( | |||||
onTap: () { | |||||
Navigator.pop(context, true); | |||||
}, | |||||
child: Container( | |||||
height: 36, | |||||
color: Colors.redAccent, | |||||
), | |||||
), | |||||
) | |||||
], | |||||
) | |||||
], | |||||
), | |||||
), | |||||
), | |||||
); | |||||
} | |||||
Widget _createText() { | |||||
return RichText( | |||||
textAlign: TextAlign.left, | |||||
text: TextSpan( | |||||
text: '', | |||||
style: TextStyle( | |||||
height: 1.2, | |||||
fontSize: 12, | |||||
color: HexColor.fromHex('#555555'), | |||||
), | |||||
children: [ | |||||
TextSpan( | |||||
text: '亲爱的用户,感谢您对智莺生活的信任!\n\n我们根据最新的监管政策要求,我们更新了', | |||||
), | |||||
TextSpan( | |||||
text: '《用户协议》', | |||||
recognizer: TapGestureRecognizer() | |||||
..onTap = () { | |||||
NativeUtil.openUrl(context, 'http://www.baidu.com'); | |||||
}, | |||||
style: TextStyle( | |||||
color: HexColor.fromHex('#FF4242'), | |||||
), | |||||
), | |||||
TextSpan( | |||||
text: '和', | |||||
), | |||||
TextSpan( | |||||
text: '《隐私权政策》', | |||||
style: TextStyle( | |||||
color: HexColor.fromHex('#FF4242'), | |||||
), | |||||
recognizer: TapGestureRecognizer() | |||||
..onTap = () { | |||||
NativeUtil.openUrl(context, 'http://www.baidu.com'); | |||||
}, | |||||
), | |||||
TextSpan( | |||||
text: | |||||
',请您在点击「同意」之前仔细阅读并充分理解。\n\n为了提供更好的服务,我们在特此说明:\n\n1.在您授权通过的情况下,我们将获取您的设备、位置等信息。您有权拒绝或取消授权;\n\n2.系统的安全保障措施,会严密的保护您的个人信息;\n\n3.未经您本人授权同意,我们不会从任何第三方处获取您的信息,也不会预期分享您的信息。', | |||||
), | |||||
]), | |||||
); | |||||
} | |||||
} |
@@ -357,11 +357,15 @@ class _GoodsShareImageState extends State<GoodsShareImage> | |||||
return; | return; | ||||
} | } | ||||
// ============= 复制文案 ================= | |||||
Clipboard.setData(ClipboardData(text: _content)); | |||||
showCupertinoModalPopup( | showCupertinoModalPopup( | ||||
context: context, | context: context, | ||||
builder: (context) => ShareAlert( | builder: (context) => ShareAlert( | ||||
_shareModel, | _shareModel, | ||||
'pub.flutter.share_icon', | 'pub.flutter.share_icon', | ||||
isContentShow: true, | |||||
// child: GoodsShareAlertContent(), | // child: GoodsShareAlertContent(), | ||||
), | ), | ||||
); | ); | ||||
@@ -1,10 +1,14 @@ | |||||
import 'dart:convert' as convert; | import 'dart:convert' as convert; | ||||
import 'dart:io'; | |||||
import 'package:cached_network_image/cached_network_image.dart'; | import 'package:cached_network_image/cached_network_image.dart'; | ||||
import 'package:flutter/cupertino.dart'; | import 'package:flutter/cupertino.dart'; | ||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'package:permission_handler/permission_handler.dart'; | |||||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||
import 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart'; | import 'package:zhiying_base_widget/dialog/global_dialog/notification_setting_dialog/notification_setting_dialog.dart'; | ||||
import 'package:zhiying_base_widget/dialog/global_dialog/policy_dialog/policy_confirm_dialog.dart'; | |||||
import 'package:zhiying_base_widget/dialog/global_dialog/policy_dialog/policy_dialog.dart'; | |||||
import 'package:zhiying_base_widget/utils/contants.dart'; | import 'package:zhiying_base_widget/utils/contants.dart'; | ||||
import 'package:zhiying_comm/models/base/base_tab_model.dart'; | import 'package:zhiying_comm/models/base/base_tab_model.dart'; | ||||
import 'package:zhiying_comm/util/image_util.dart'; | import 'package:zhiying_comm/util/image_util.dart'; | ||||
@@ -130,8 +134,28 @@ class _HomePageState extends State<HomePage> { | |||||
} | } | ||||
Future<bool> _checkLimit(BaseTabModel model) async { | Future<bool> _checkLimit(BaseTabModel model) async { | ||||
showCupertinoDialog( | |||||
context: context, builder: (_) => NotificationSettingDialog()); | |||||
// bool agree = null; | |||||
// while (agree == null) { | |||||
// agree = await showCupertinoDialog( | |||||
// context: context, builder: (_) => PolicyDialog()); | |||||
// } | |||||
// if (!agree) { | |||||
// bool accept = null; | |||||
// while (accept == null) { | |||||
// accept = await showCupertinoDialog( | |||||
// context: context, builder: (_) => PolicyConfirmDialog()); | |||||
// } | |||||
// if (!accept) { | |||||
// exit(0); | |||||
// } | |||||
// } | |||||
// | |||||
// PermissionStatus status = await Permission.notification.status; | |||||
// if (status != PermissionStatus.granted) { | |||||
// await showCupertinoDialog( | |||||
// context: context, builder: (_) => NotificationSettingDialog()); | |||||
// } | |||||
if (model.requiredLogin == '1') { | if (model.requiredLogin == '1') { | ||||
UserInfoModel user = | UserInfoModel user = | ||||
await Provider.of<UserInfoNotifier>(context, listen: false) | await Provider.of<UserInfoNotifier>(context, listen: false) | ||||
@@ -0,0 +1,43 @@ | |||||
import 'package:flutter/material.dart'; | |||||
/// 虚线绘制 | |||||
class DottedLine extends StatelessWidget { | |||||
final double height; | |||||
final double width; | |||||
final Color color; | |||||
final Axis direction; | |||||
const DottedLine({ | |||||
this.height = 1, | |||||
this.width = 10, | |||||
this.color = Colors.black, | |||||
this.direction = Axis.horizontal, | |||||
}); | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return LayoutBuilder( | |||||
builder: (BuildContext context, BoxConstraints constraints) { | |||||
final boxWidth = direction == Axis.horizontal | |||||
? constraints.constrainWidth() | |||||
: constraints.constrainHeight(); | |||||
final dashWidth = width; | |||||
final dashHeight = height; | |||||
final dashCount = (boxWidth / (2 * dashWidth)).floor(); | |||||
return Flex( | |||||
children: List.generate(dashCount, (_) { | |||||
return SizedBox( | |||||
width: direction == Axis.horizontal ? dashWidth : dashHeight, | |||||
height: direction == Axis.horizontal ? dashHeight : dashWidth, | |||||
child: DecoratedBox( | |||||
decoration: BoxDecoration(color: color), | |||||
), | |||||
); | |||||
}), | |||||
mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||||
direction: direction, | |||||
); | |||||
}, | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,57 @@ | |||||
import 'package:zhiying_base_widget/widgets/share/models/share_icon_model.dart'; | |||||
class ShareAlertModel { | |||||
List<ShareIconModel> icons; | |||||
String selectIcon; | |||||
String selectImg; | |||||
String selectTextImg; | |||||
String successImg; | |||||
String sucText; | |||||
String sucTips; | |||||
String selectText1; | |||||
String selectText2; | |||||
ShareAlertModel( | |||||
{this.icons, | |||||
this.selectIcon, | |||||
this.selectImg, | |||||
this.selectTextImg, | |||||
this.successImg, | |||||
this.sucText, | |||||
this.sucTips, | |||||
this.selectText1, | |||||
this.selectText2}); | |||||
ShareAlertModel.fromJson(Map<String, dynamic> json) { | |||||
if (json['list'] != null) { | |||||
icons = new List<ShareIconModel>(); | |||||
json['list'].forEach((v) { | |||||
icons.add(new ShareIconModel.fromJson(v)); | |||||
}); | |||||
} | |||||
selectIcon = json['select_icon']; | |||||
selectImg = json['select_img']; | |||||
selectTextImg = json['select_text_img']; | |||||
successImg = json['success_img']; | |||||
sucText = json['suc_text']; | |||||
sucTips = json['suc_tips']; | |||||
selectText1 = json['select_text1']; | |||||
selectText2 = json['select_text2']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
if (this.icons != null) { | |||||
data['list'] = this.icons.map((v) => v.toJson()).toList(); | |||||
} | |||||
data['select_icon'] = this.selectIcon; | |||||
data['select_img'] = this.selectImg; | |||||
data['select_text_img'] = this.selectTextImg; | |||||
data['success_img'] = this.successImg; | |||||
data['suc_text'] = this.sucText; | |||||
data['suc_tips'] = this.sucTips; | |||||
data['select_text1'] = this.selectText1; | |||||
data['select_text2'] = this.selectText2; | |||||
return data; | |||||
} | |||||
} |
@@ -11,18 +11,52 @@ import 'package:share_extend/share_extend.dart'; | |||||
import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | ||||
import 'package:zhiying_base_widget/dialog/loading/loading.dart'; | import 'package:zhiying_base_widget/dialog/loading/loading.dart'; | ||||
import 'package:zhiying_base_widget/utils/image_download_util/image_download_util.dart'; | import 'package:zhiying_base_widget/utils/image_download_util/image_download_util.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/models/share_alert_model.dart'; | |||||
import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | import 'package:zhiying_base_widget/widgets/share/models/share_data_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/models/share_icon_model.dart'; | import 'package:zhiying_base_widget/widgets/share/models/share_icon_model.dart'; | ||||
import 'package:zhiying_base_widget/widgets/share/share_alert_content.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
class ShareAlert extends StatelessWidget { | |||||
class ShareAlert extends StatefulWidget { | |||||
final String skipIdentifier; | final String skipIdentifier; | ||||
final Widget child; | |||||
final bool isContentShow; | |||||
final ShareDataModel model; | final ShareDataModel model; | ||||
const ShareAlert(this.model, this.skipIdentifier, {Key key, this.child}) | |||||
const ShareAlert(this.model, this.skipIdentifier, | |||||
{Key key, this.isContentShow = false}) | |||||
: super(key: key); // 中间视图 | : super(key: key); // 中间视图 | ||||
@override | |||||
_ShareAlertState createState() => _ShareAlertState(); | |||||
} | |||||
class _ShareAlertState extends State<ShareAlert> { | |||||
ShareAlertModel _iconModel; | |||||
@override | |||||
void initState() { | |||||
NetUtil.request('/api/v1/mod/${widget.skipIdentifier}', | |||||
method: NetMethod.GET, onCache: (data) { | |||||
_parseData(data); | |||||
}, onSuccess: (data) { | |||||
_parseData(data); | |||||
}, onError: (err) {}); | |||||
super.initState(); | |||||
} | |||||
void _parseData(Map<String, dynamic> data) { | |||||
List modList = data['mod_list']; | |||||
Map d = modList.first; | |||||
if (d != null) { | |||||
String dString = d['data']; | |||||
_iconModel = ShareAlertModel.fromJson( | |||||
Map<String, dynamic>.from(jsonDecode(dString))); | |||||
setState(() {}); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return GestureDetector( | return GestureDetector( | ||||
@@ -34,9 +68,13 @@ class ShareAlert extends StatelessWidget { | |||||
child: Column( | child: Column( | ||||
children: <Widget>[ | children: <Widget>[ | ||||
Expanded( | Expanded( | ||||
child: Center(child: child ?? Container()), | |||||
child: Center( | |||||
child: widget.isContentShow | |||||
? ShareAlertContent(_iconModel) | |||||
: Container()), | |||||
), | ), | ||||
_ShareAlertContent(this.model, this.skipIdentifier), | |||||
_ShareAlertContent( | |||||
widget.model, widget.skipIdentifier, _iconModel), | |||||
], | ], | ||||
), | ), | ||||
), // 模糊化 | ), // 模糊化 | ||||
@@ -52,8 +90,10 @@ class ShareAlert extends StatelessWidget { | |||||
class _ShareAlertContent extends StatefulWidget { | class _ShareAlertContent extends StatefulWidget { | ||||
final ShareDataModel model; | final ShareDataModel model; | ||||
final String skipIdentifier; | final String skipIdentifier; | ||||
final ShareAlertModel iconModel; | |||||
const _ShareAlertContent(this.model, this.skipIdentifier, {Key key}) | |||||
const _ShareAlertContent(this.model, this.skipIdentifier, this.iconModel, | |||||
{Key key}) | |||||
: super(key: key); | : super(key: key); | ||||
@override | @override | ||||
@@ -61,33 +101,6 @@ class _ShareAlertContent extends StatefulWidget { | |||||
} | } | ||||
class _ShareAlertContentState extends State<_ShareAlertContent> { | class _ShareAlertContentState extends State<_ShareAlertContent> { | ||||
List<ShareIconModel> _icons = []; | |||||
@override | |||||
void initState() { | |||||
NetUtil.request('/api/v1/mod/${widget.skipIdentifier}', | |||||
method: NetMethod.GET, onCache: (data) { | |||||
_parseData(data); | |||||
}, onSuccess: (data) { | |||||
_parseData(data); | |||||
}, onError: (err) {}); | |||||
super.initState(); | |||||
} | |||||
void _parseData(Map<String, dynamic> data) { | |||||
List modList = data['mod_list']; | |||||
Map d = modList.first; | |||||
if (d != null) { | |||||
String dString = d['data']; | |||||
List list = jsonDecode(dString)['list']; | |||||
_icons = list.map((item) { | |||||
return ShareIconModel.fromJson(Map<String, dynamic>.from(item)); | |||||
}).toList(); | |||||
setState(() {}); | |||||
} | |||||
} | |||||
@override | @override | ||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return GestureDetector( | return GestureDetector( | ||||
@@ -157,9 +170,10 @@ class _ShareAlertContentState extends State<_ShareAlertContent> { | |||||
return Wrap( | return Wrap( | ||||
spacing: 10, | spacing: 10, | ||||
runSpacing: 10, | runSpacing: 10, | ||||
children: _icons.map((item) { | |||||
return _createIcon(item); | |||||
}).toList(), | |||||
children: widget.iconModel?.icons?.map((item) { | |||||
return _createIcon(item); | |||||
})?.toList() ?? | |||||
[], | |||||
); | ); | ||||
} | } | ||||
@@ -0,0 +1,110 @@ | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:zhiying_base_widget/widgets/others/dotted_line/dotted_line.dart'; | |||||
import 'package:zhiying_base_widget/widgets/share/models/share_alert_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class ShareAlertContent extends StatelessWidget { | |||||
final ShareAlertModel model; | |||||
const ShareAlertContent(this.model, {Key key}) : super(key: key); | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return SafeArea( | |||||
child: Center( | |||||
child: UnconstrainedBox( | |||||
child: Container( | |||||
padding: EdgeInsets.all(14), | |||||
width: 220, | |||||
decoration: BoxDecoration( | |||||
color: Colors.white, | |||||
borderRadius: BorderRadius.circular(12), | |||||
), | |||||
child: Column( | |||||
children: <Widget>[ | |||||
Container( | |||||
width: 92, | |||||
height: 92, | |||||
margin: EdgeInsets.only(top: 10), | |||||
child: CachedNetworkImage( | |||||
imageUrl: model?.successImg ?? '', | |||||
), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8.0), | |||||
child: Text( | |||||
model?.sucText ?? '', | |||||
style: TextStyle( | |||||
color: HexColor.fromHex('#333333'), | |||||
fontSize: 18, | |||||
fontWeight: FontWeight.bold, | |||||
), | |||||
), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 4, left: 30, right: 30), | |||||
child: Text( | |||||
model?.sucTips ?? '', | |||||
textAlign: TextAlign.center, | |||||
style: TextStyle( | |||||
color: HexColor.fromHex('#999999'), | |||||
fontSize: 11, | |||||
fontWeight: FontWeight.normal, | |||||
), | |||||
), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 10.0), | |||||
child: _createLine( | |||||
model?.selectImg ?? '', model?.selectText1 ?? ''), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 10.0), | |||||
child: _createLine( | |||||
model?.selectTextImg ?? '', model?.selectText2 ?? ''), | |||||
), | |||||
], | |||||
), | |||||
), | |||||
), | |||||
), | |||||
); | |||||
} | |||||
Widget _createLine(String imgUrl, String text) { | |||||
return Row( | |||||
children: <Widget>[ | |||||
Container( | |||||
width: 12, | |||||
height: 12, | |||||
// color: Colors.redAccent, | |||||
child: CachedNetworkImage( | |||||
imageUrl: imgUrl ?? '', | |||||
), | |||||
), | |||||
Padding( | |||||
padding: const EdgeInsets.only(left: 4, right: 4), | |||||
child: Text( | |||||
text ?? '', | |||||
style: TextStyle(fontSize: 11, color: HexColor.fromHex('#999999')), | |||||
), | |||||
), | |||||
Expanded( | |||||
child: DottedLine( | |||||
width: 2, | |||||
height: 0.5, | |||||
color: HexColor.fromHex('#a8a8a8'), | |||||
)), | |||||
Container( | |||||
margin: EdgeInsets.only(left: 6), | |||||
width: 15, | |||||
height: 15, | |||||
child: CachedNetworkImage( | |||||
imageUrl: model?.selectIcon ?? '', | |||||
), | |||||
), | |||||
], | |||||
); | |||||
} | |||||
} |