| @@ -23,9 +23,15 @@ if (flutterVersionName == null) { | |||
| flutterVersionName = '1.0' | |||
| } | |||
| // 获取当前时间(年月日) | |||
| def releaseTime() { | |||
| return new Date().format("YYYYMMdd", TimeZone.getTimeZone("UTC")) | |||
| } | |||
| apply plugin: 'com.android.application' | |||
| apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" | |||
| android { | |||
| compileSdkVersion 28 | |||
| @@ -33,23 +39,116 @@ android { | |||
| disable 'InvalidPackage' | |||
| } | |||
| // 默认配置 | |||
| defaultConfig { | |||
| // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | |||
| applicationId "cn.zhios.zhiying_base_widget_example" | |||
| minSdkVersion 19 | |||
| applicationId "cn.zhios.zhiying" | |||
| minSdkVersion 21 | |||
| targetSdkVersion 28 | |||
| versionCode flutterVersionCode.toInteger() | |||
| versionName flutterVersionName | |||
| versionCode 1 | |||
| versionName "1.0" | |||
| aaptOptions.cruncherEnabled = false | |||
| aaptOptions.useNewCruncher = false | |||
| multiDexEnabled true | |||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||
| ndk { | |||
| //选择要添加的对应cpu类型的.so库。 | |||
| abiFilters 'armeabi', 'armeabi-v7a', 'x86','x86_64', 'mips', 'mips64', 'arm64-v8a' | |||
| } | |||
| } | |||
| buildTypes { | |||
| debug { | |||
| buildConfigField "boolean", "LOG_DEBUG", "true" | |||
| minifyEnabled false | |||
| zipAlignEnabled true | |||
| shrinkResources false | |||
| proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | |||
| } | |||
| release { | |||
| // TODO: Add your own signing config for the release build. | |||
| // Signing with the debug keys for now, so `flutter run --release` works. | |||
| signingConfig signingConfigs.debug | |||
| buildConfigField "boolean", "LOG_DEBUG", "false" | |||
| minifyEnabled false | |||
| shrinkResources false | |||
| zipAlignEnabled true | |||
| proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | |||
| } | |||
| } | |||
| dexOptions { | |||
| //最大堆内存 | |||
| javaMaxHeapSize "4g"//4g | |||
| //使用增量模式构建 | |||
| incremental true | |||
| //是否支持大工程模式 | |||
| jumboMode = true | |||
| //预编译 | |||
| preDexLibraries = false | |||
| //线程数 | |||
| threadCount = 8 | |||
| } | |||
| // | |||
| // // 签名配置 | |||
| // signingConfigs { | |||
| // // 智夜生活 | |||
| // zhiying { | |||
| // storeFile file('zhiying.jks') | |||
| // storePassword 'zhioscom' | |||
| // keyAlias 'zysh' | |||
| // keyPassword 'zhioscom' | |||
| // v1SigningEnabled true | |||
| // v2SigningEnabled true | |||
| // } | |||
| // | |||
| // } | |||
| // | |||
| // flavorDimensions "app" | |||
| // | |||
| // | |||
| // // 应用信息配置 | |||
| // productFlavors { | |||
| // // 智夜生活 | |||
| // zhiying { | |||
| // applicationId "cn.zhios.zhiying" | |||
| // versionCode 1 | |||
| // dimension "app" | |||
| // versionName '1.0.0' | |||
| // // 签名信息 | |||
| // signingConfig signingConfigs.zhiying | |||
| // } | |||
| // } | |||
| // | |||
| // // 打包脚本 | |||
| // android.applicationVariants.all { variant -> | |||
| // if (variant.buildType.name != "debug") { | |||
| // variant.getPackageApplicationProvider().get().outputDirectory = new File(project.rootDir.absolutePath + "/app/build/outputs/apk") | |||
| // } | |||
| // | |||
| // variant.outputs.all { output -> | |||
| // def outputFile = output.outputFile | |||
| // if (outputFile != null && outputFile.name.endsWith('.apk')) { | |||
| // //这里修改apk文件名 | |||
| // def fileName = "${variant.productFlavors[0].name}_${releaseTime()}01_&V${variant.productFlavors[0].versionCode}.apk" | |||
| // outputFileName = fileName | |||
| // } | |||
| // } | |||
| // } | |||
| configurations.all { | |||
| resolutionStrategy.eachDependency { DependencyResolveDetails details -> | |||
| def requested = details.requested | |||
| if (requested.group == 'com.android.support') { | |||
| if (!requested.name.startsWith("multidex")) { | |||
| details.useVersion '28.0.3' | |||
| } | |||
| } | |||
| resolutionStrategy.force 'com.android.support:support-v4:28.0.0' | |||
| } | |||
| } | |||
| } | |||
| flutter { | |||
| @@ -10,6 +10,7 @@ | |||
| android:name="io.flutter.app.FlutterApplication" | |||
| android:label="zhiying_base_widget_example" | |||
| android:icon="@mipmap/ic_launcher" | |||
| android:usesCleartextTraffic="true" | |||
| tools:replace="android:label"> | |||
| <activity | |||
| android:name=".MainActivity" | |||
| @@ -38,7 +38,7 @@ public class MainActivity extends FlutterActivity implements ZhiyingFlutterCommN | |||
| @Override | |||
| public Map getSetting() { | |||
| Map map = new HashMap(); | |||
| map.put("domain", "http://192.168.0.113:5000"); //"http://120.76.175.204:8989"); | |||
| map.put("domain", "http://inapi.izhyin.cn"); //"http://120.76.175.204:8989"); | |||
| map.put("master_id", "123456"); | |||
| map.put("secret_key", "123456"); | |||
| // map.put("token", "123465"); | |||
| @@ -37,8 +37,9 @@ class _MyAppState extends State<MyApp> { | |||
| super.initState(); | |||
| print('初始化~~~~'); | |||
| BaseWidgetRegister.init(); | |||
| print('初始化百川'); | |||
| FlutterAlibc.initAlibc(version: "", appName: "").then((result) { | |||
| Logger.debug('${result.errorCode} ${result.errorMessage}'); | |||
| print("白川"+'${result.errorCode} ${result.errorMessage}'); | |||
| }); | |||
| } | |||
| @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/Intellect_search_set_model.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/intellect_dialog_data_model.dart'; | |||
| import 'package:zhiying_base_widget/utils/contants.dart'; | |||
| import 'package:zhiying_comm/util/shared_prefe_util.dart'; | |||
| @@ -15,13 +16,22 @@ import 'package:string_validator/string_validator.dart'; | |||
| class IntellectCreate { | |||
| static IntellectSearchSetModel _setModel; | |||
| static bool isRequest = false; | |||
| ///判断规则 | |||
| static checkAndCreate(AppLifecycleState state, BuildContext context) async { | |||
| if (state == AppLifecycleState.resumed && | |||
| !Constants.isShowIntellectDialog) { | |||
| if (state == AppLifecycleState.resumed && !isRequest) { | |||
| isRequest = true; | |||
| _requestSetData(context); | |||
| } | |||
| // Timer(Duration(milliseconds: 500), () async { | |||
| // if (!Constants.isShowIntellectDialog) { | |||
| // Constants.isShowIntellectDialog = true; | |||
| // await showDialog( | |||
| // context: context, child: IntellectSearchGoodsDialog()); | |||
| // Constants.isShowIntellectDialog = false; | |||
| // } | |||
| // }); | |||
| } | |||
| ///请求设置参数 | |||
| @@ -30,31 +40,36 @@ class IntellectCreate { | |||
| var param = {"webId": ""}; | |||
| //请求参数 | |||
| NetUtil.request('/api/v1/cfg/app_clipboard', params: param, | |||
| await NetUtil.request('/api/v1/cfg/clipboard_base', params: param, | |||
| onSuccess: (data) async { | |||
| print("设置参数" + data.toString()); | |||
| ///检查是否已缓存过设置信息 | |||
| String result = await SharedPreferencesUtil.getStringValue( | |||
| Constants.spIsCacheSetModel); | |||
| _setModel = IntellectSearchSetModel.fromJson(data); | |||
| _setModel = IntellectSearchSetModel.fromJson( | |||
| json.decode(data['clipboard_base'])); | |||
| if (result.isEmpty) { | |||
| validate(context, _setModel); | |||
| } | |||
| SharedPreferencesUtil.setNetCacheResult( | |||
| Constants.spIsCacheSetModel, json.encode(data)); | |||
| Constants.spIsCacheSetModel, data['clipboard_base']); | |||
| }); | |||
| isRequest = false; | |||
| ///拿缓存数据 | |||
| var cacheData = await SharedPreferencesUtil.getNetCacheResult( | |||
| Constants.spIsCacheSetModel); | |||
| ///如果存在缓存直接进入验证阶段 | |||
| if (cacheData.isNotEmpty) { | |||
| if (cacheData != null) { | |||
| _setModel = IntellectSearchSetModel.fromJson(cacheData); | |||
| validate(context, _setModel); | |||
| } | |||
| } else { | |||
| validate(context, _setModel); | |||
| isRequest = false; | |||
| } | |||
| } | |||
| @@ -65,46 +80,73 @@ class IntellectCreate { | |||
| ///请求数据打开弹窗 | |||
| static requestDialog(BuildContext context, String content) async { | |||
| Constants.isShowIntellectDialog = true; | |||
| await showDialog(context: context, child: IntellectSearchGoodsDialog()); | |||
| Constants.isShowIntellectDialog = false; | |||
| content = | |||
| "6緮置内容 Http:/T¢ZKkjceixTjW¢转移至ta0寶【URBANISTA/爱班Stockholm斯德哥尔摩 真无线蓝牙运动耳机半入耳式】"; | |||
| var params = {"content": content}; | |||
| NetUtil.request("/api/v1/clipboard/parse", | |||
| params: params, method: NetMethod.POST, onSuccess: (data) async { | |||
| isRequest = false; | |||
| if (data == null || data.toString().length == 0) { | |||
| if (!Constants.isShowIntellectDialog) { | |||
| Constants.isShowIntellectDialog = true; | |||
| await showDialog( | |||
| context: context, child: IntellectSearchNoGoodsDialog()); | |||
| Constants.isShowIntellectDialog = false; | |||
| } | |||
| } else { | |||
| IntellectDialogDataModel model = | |||
| IntellectDialogDataModel.fromJson(data); | |||
| if (!Constants.isShowIntellectDialog) { | |||
| Constants.isShowIntellectDialog = true; | |||
| await showDialog( | |||
| context: context, | |||
| child: IntellectSearchGoodsDialog( | |||
| model: model, | |||
| )); | |||
| Constants.isShowIntellectDialog = false; | |||
| } | |||
| } | |||
| }); | |||
| } | |||
| ///检查字段是否被监听 | |||
| static void validate( | |||
| BuildContext context, IntellectSearchSetModel setModel) async { | |||
| ClipboardData data = await Clipboard.getData(Clipboard.kTextPlain); | |||
| String content = data.text; | |||
| //是否监听 | |||
| if (setModel.state != "1") { | |||
| return; | |||
| } | |||
| ///长度大小限制 | |||
| if (setModel.keywordLimitState == "1" && | |||
| (int.tryParse(setModel.keywordLimitMin) < content.length) || | |||
| (int.tryParse(setModel.keywordLimitMax) > content.length)) { | |||
| return; | |||
| } | |||
| //是否纯数字 | |||
| if (setModel.keywordNum == "1" && isNumeric(content)) { | |||
| return; | |||
| } | |||
| ///是否纯字母 | |||
| if (setModel.keywordAlpha == "1" && isAlpha(content)) { | |||
| return; | |||
| } | |||
| ///是否仅包含数字和字母 | |||
| if (setModel.keywordAlphanum == "1" && isAlphanumeric(content)) { | |||
| return; | |||
| } | |||
| String content = data?.text ?? ""; | |||
| // //是否监听 | |||
| // if (setModel.isListen != "1") { | |||
| // return; | |||
| // } | |||
| // | |||
| // if(content==null||content.length==0){ | |||
| // return; | |||
| // } | |||
| // ///长度大小限制 | |||
| // if (setModel.isKeyLength == "1" && | |||
| // (int.tryParse(setModel.keyLengthMin) > content.length) || | |||
| // (int.tryParse(setModel.keyLengthMax) < content.length)) { | |||
| // return; | |||
| // } | |||
| // | |||
| // //是否纯数字 | |||
| // if (setModel.isNumber == "1" && isNumeric(content)) { | |||
| // return; | |||
| // } | |||
| // | |||
| // ///是否纯字母 | |||
| // if (setModel.isLetter == "1" && isAlpha(content)) { | |||
| // return; | |||
| // } | |||
| // | |||
| // ///是否仅包含数字和字母 | |||
| // if (setModel.isNumAndLet == "1" && isAlphanumeric(content)) { | |||
| // return; | |||
| // } | |||
| ///是否包含某个排除词 | |||
| if (setModel.exclude.length > 0) { | |||
| for (var item in setModel.exclude) { | |||
| if (setModel.banWords != null && setModel.banWords.length > 0) { | |||
| for (var item in setModel.banWords) { | |||
| if (contains(content, item)) { | |||
| return; | |||
| } | |||
| @@ -1,10 +1,24 @@ | |||
| import 'dart:convert'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'package:flutter_screenutil/flutter_screenutil.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/has_goods_dialog_style_model.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/intellect_dialog_data_model.dart'; | |||
| import 'package:zhiying_base_widget/widgets/home/home_quick_entry/cached_network_image_util.dart'; | |||
| import 'package:cached_network_image/cached_network_image.dart'; | |||
| import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/model/wallet_detail_model.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import 'package:provider/provider.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import 'package:flutter_alibc/flutter_alibc.dart'; | |||
| import 'package:flutter_alibc/alibc_model.dart'; | |||
| class IntellectSearchGoodsDialog extends StatefulWidget { | |||
| final IntellectDialogDataModel model; | |||
| const IntellectSearchGoodsDialog({Key key, this.model}) : super(key: key); | |||
| @override | |||
| _IntellectSearchGoodsDialogState createState() => | |||
| _IntellectSearchGoodsDialogState(); | |||
| @@ -12,8 +26,19 @@ class IntellectSearchGoodsDialog extends StatefulWidget { | |||
| class _IntellectSearchGoodsDialogState | |||
| extends State<IntellectSearchGoodsDialog> { | |||
| HasGoodsDialogStyleModel _styleModel; | |||
| UserInfoModel _userInfo; | |||
| @override | |||
| void initState() { | |||
| //Clipboard.setData(ClipboardData(text: "")); | |||
| requestStyle(); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| _userInfo = Provider.of<UserInfoNotifier>(context).userInfo; | |||
| return Scaffold( | |||
| backgroundColor: Colors.transparent, | |||
| body: InkWell( | |||
| @@ -35,7 +60,8 @@ class _IntellectSearchGoodsDialogState | |||
| right: 30.w, | |||
| bottom: 48.h), | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| color: | |||
| HexColor.fromHex(_styleModel?.bgColor ?? "#FFFFFF"), | |||
| borderRadius: BorderRadius.circular(16)), | |||
| width: double.infinity, | |||
| child: Column( | |||
| @@ -46,11 +72,11 @@ class _IntellectSearchGoodsDialogState | |||
| height: 76.h, | |||
| child: Center( | |||
| child: Container( | |||
| color: Colors.red, | |||
| height: 76.h, | |||
| width: 216.w, | |||
| child: CachedNetworkImage( | |||
| imageUrl: "", | |||
| imageUrl: _styleModel?.titleImg ?? "", | |||
| fit: BoxFit.fill, | |||
| ), | |||
| )), | |||
| ), | |||
| @@ -68,9 +94,14 @@ class _IntellectSearchGoodsDialogState | |||
| crossAxisAlignment: CrossAxisAlignment.start, | |||
| children: <Widget>[ | |||
| Container( | |||
| color: Colors.red, | |||
| width: 160.w, | |||
| height: 160.w, | |||
| decoration: BoxDecoration( | |||
| borderRadius: BorderRadius.circular(6), | |||
| image: DecorationImage( | |||
| image: | |||
| CachedNetworkImageProvider(widget.model?.thumbnail ?? ""), | |||
| fit: BoxFit.fill)), | |||
| ), | |||
| SizedBox( | |||
| width: 19.w, | |||
| @@ -84,7 +115,7 @@ class _IntellectSearchGoodsDialogState | |||
| Column( | |||
| children: <Widget>[ | |||
| Text( | |||
| "2020新款春款波点连衣裙新短发dfasdfas短发时代发发呆发顺丰的打算萨阿啊", | |||
| widget.model?.title ?? "", | |||
| maxLines: 2, | |||
| overflow: TextOverflow.ellipsis, | |||
| style: TextStyle(color: Colors.black, fontSize: 24.sp), | |||
| @@ -105,21 +136,30 @@ class _IntellectSearchGoodsDialogState | |||
| Container( | |||
| width: 30.w, | |||
| height: 30.w, | |||
| decoration: BoxDecoration(color: Colors.white), | |||
| decoration: BoxDecoration( | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList?.coupon?.bgColor ?? | |||
| "")), | |||
| child: Center( | |||
| child: Text( | |||
| "券", | |||
| _styleModel?.moduleList?.coupon?.content ?? | |||
| "", | |||
| style: TextStyle( | |||
| color: Colors.red, fontSize: 20.sp), | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList?.coupon?.fontColor ?? | |||
| ""), | |||
| fontSize: 20.sp), | |||
| ), | |||
| ), | |||
| ), | |||
| Padding( | |||
| padding: const EdgeInsets.only(left: 4, right: 4), | |||
| child: Text( | |||
| "¥100", | |||
| "¥" + (widget.model?.couponPrice ?? ""), | |||
| style: TextStyle( | |||
| color: Colors.white, fontSize: 20.sp), | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList?.couponPrice?.fontColor), | |||
| fontSize: 20.sp), | |||
| ), | |||
| ) | |||
| ], | |||
| @@ -130,7 +170,8 @@ class _IntellectSearchGoodsDialogState | |||
| ), | |||
| Container( | |||
| decoration: BoxDecoration( | |||
| color: HexColor.fromHex("#FFFFF6C1"), | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.commission?.bgColor), | |||
| borderRadius: BorderRadius.circular(2)), | |||
| padding: EdgeInsets.all(2), | |||
| child: Row( | |||
| @@ -144,9 +185,17 @@ class _IntellectSearchGoodsDialogState | |||
| padding: | |||
| const EdgeInsets.only(left: 4, right: 4), | |||
| child: Text( | |||
| "预计返", | |||
| (_styleModel?.moduleList?.commission | |||
| ?.content ?? | |||
| "") + | |||
| " ¥" + | |||
| (widget.model?.commission ?? ""), | |||
| style: TextStyle( | |||
| color: Colors.deepOrangeAccent, | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList | |||
| ?.commission | |||
| ?.fontColor ?? | |||
| ""), | |||
| fontSize: 20.sp), | |||
| ), | |||
| ), | |||
| @@ -167,8 +216,12 @@ class _IntellectSearchGoodsDialogState | |||
| Padding( | |||
| padding: const EdgeInsets.only(bottom: 2), | |||
| child: Text( | |||
| "券后", | |||
| style: TextStyle(fontSize: 20.sp, color: Colors.red), | |||
| _styleModel?.moduleList?.couponAfter?.content ?? "", | |||
| style: TextStyle( | |||
| fontSize: 20.sp, | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList?.couponAfterPrice?.fontColor ?? | |||
| "")), | |||
| ), | |||
| ), | |||
| Padding( | |||
| @@ -176,14 +229,19 @@ class _IntellectSearchGoodsDialogState | |||
| const EdgeInsets.only(bottom: 2, left: 4, right: 4), | |||
| child: Text( | |||
| "¥", | |||
| style: TextStyle(fontSize: 20.sp, color: Colors.red), | |||
| style: TextStyle( | |||
| fontSize: 20.sp, | |||
| color: HexColor.fromHex(_styleModel | |||
| ?.moduleList?.couponAfterPrice?.fontColor ?? | |||
| "")), | |||
| ), | |||
| ), | |||
| Text( | |||
| "999", | |||
| widget?.model?.price ?? "", | |||
| style: TextStyle( | |||
| fontSize: 32.sp, | |||
| color: Colors.red, | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.couponAfterPrice?.fontColor), | |||
| ), | |||
| ) | |||
| ], | |||
| @@ -201,46 +259,108 @@ class _IntellectSearchGoodsDialogState | |||
| SizedBox( | |||
| height: 24, | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| child: Container( | |||
| margin: EdgeInsets.only(left: 20.w, right: 20.w), | |||
| decoration: BoxDecoration( | |||
| color: Colors.red, borderRadius: BorderRadius.circular(50)), | |||
| child: Center( | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(12.0), | |||
| child: Text( | |||
| "合法化 ", | |||
| style: TextStyle(color: Colors.white, fontSize: 24.sp), | |||
| ), | |||
| )), | |||
| )) | |||
| ], | |||
| InkWell( | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| child: Container( | |||
| margin: EdgeInsets.only(left: 20.w, right: 20.w), | |||
| decoration: BoxDecoration( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.saveBtn?.bgColor ?? ""), | |||
| borderRadius: BorderRadius.circular(50)), | |||
| child: Center( | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(12.0), | |||
| child: Text( | |||
| (_styleModel?.moduleList?.saveBtn?.content ?? "") + | |||
| " ¥" + | |||
| (double.tryParse(widget?.model?.couponPrice ?? '0') + | |||
| double.tryParse( | |||
| widget?.model?.commission ?? '0')) | |||
| .toString() | |||
| .toString(), | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.saveBtn?.fontColor), | |||
| fontSize: 24.sp), | |||
| ), | |||
| )), | |||
| )) | |||
| ], | |||
| ), | |||
| onTap: () { | |||
| openUrl(); | |||
| }, | |||
| ), | |||
| SizedBox( | |||
| height: 16, | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| child: Container( | |||
| margin: EdgeInsets.only(left: 20.w, right: 20.w), | |||
| decoration: BoxDecoration( | |||
| color: Colors.red, borderRadius: BorderRadius.circular(50)), | |||
| child: Center( | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(12.0), | |||
| child: Text( | |||
| "合法化 ", | |||
| style: TextStyle(color: Colors.white, fontSize: 24.sp), | |||
| ), | |||
| )), | |||
| )) | |||
| ], | |||
| InkWell( | |||
| child: Row( | |||
| children: <Widget>[ | |||
| Expanded( | |||
| child: Container( | |||
| margin: EdgeInsets.only(left: 20.w, right: 20.w), | |||
| decoration: BoxDecoration( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.viewGoodsBtn?.bgColor ?? ""), | |||
| borderRadius: BorderRadius.circular(50)), | |||
| child: Center( | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(12.0), | |||
| child: Text( | |||
| _styleModel?.moduleList?.viewGoodsBtn?.content ?? "", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.viewGoodsBtn?.fontColor ?? | |||
| ""), | |||
| fontSize: 24.sp), | |||
| ), | |||
| )), | |||
| )) | |||
| ], | |||
| ), | |||
| onTap: () { | |||
| openGoodsDetails(); | |||
| }, | |||
| ) | |||
| ], | |||
| ); | |||
| } | |||
| void requestStyle() { | |||
| NetUtil.request("/api/v1/cfg/clipboard_identified", onSuccess: (data) { | |||
| _styleModel = HasGoodsDialogStyleModel.fromJson( | |||
| json.decode(data['clipboard_identified'])); | |||
| setState(() {}); | |||
| }); | |||
| } | |||
| void openUrl() async { | |||
| ///跳转购买 | |||
| if (_userInfo?.token == null || _userInfo.token == '') { | |||
| print('need login...'); | |||
| RouterUtil.goLogin(context); | |||
| return; | |||
| } else { | |||
| if (widget?.model?.provider == 'taobao') { | |||
| TradeResult result = | |||
| await FlutterAlibc.openByUrl(url: widget?.model?.couponUrl); | |||
| Logger.debug('${result.errorCode} ${result.errorMessage} '); | |||
| } else { | |||
| RouterUtil.openWebview(widget?.model?.couponUrl, context); | |||
| } | |||
| } | |||
| } | |||
| ///打开详情 | |||
| void openGoodsDetails() { | |||
| String provider = widget.model.provider; | |||
| String goodId = widget.model.itemId; | |||
| RouterUtil.route(SkipModel(skipIdentifier: "goods_details"), | |||
| {"provider": provider, "good_id": goodId}, context).then((data){ | |||
| Navigator.pop(context); | |||
| }); | |||
| } | |||
| } | |||
| @@ -1,11 +1,19 @@ | |||
| import 'dart:convert'; | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter/services.dart'; | |||
| import 'package:flutter_screenutil/flutter_screenutil.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/intellect_dialog_data_model.dart'; | |||
| import 'package:zhiying_base_widget/dialog/global_dialog/intellect_search_goods_dialog/model/no_goods_dialog_style_model.dart'; | |||
| import 'package:zhiying_base_widget/widgets/home/home_quick_entry/cached_network_image_util.dart'; | |||
| import 'package:cached_network_image/cached_network_image.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| class IntellectSearchNoGoodsDialog extends StatefulWidget { | |||
| final IntellectDialogDataModel model; | |||
| const IntellectSearchNoGoodsDialog({Key key, this.model}) : super(key: key); | |||
| @override | |||
| _IntellectSearchNoGoodsDialogState createState() => | |||
| _IntellectSearchNoGoodsDialogState(); | |||
| @@ -15,10 +23,13 @@ class _IntellectSearchNoGoodsDialogState | |||
| extends State<IntellectSearchNoGoodsDialog> { | |||
| TextEditingController _textEditingController; | |||
| NoGoodsDialogStyleModel _styleModel; | |||
| @override | |||
| void initState() { | |||
| _textEditingController = TextEditingController(); | |||
| _getClipBoardData(); | |||
| super.initState(); | |||
| } | |||
| @@ -26,47 +37,62 @@ class _IntellectSearchNoGoodsDialogState | |||
| _getClipBoardData() async { | |||
| ClipboardData data = await Clipboard.getData(Clipboard.kTextPlain); | |||
| _textEditingController.text = data.text; | |||
| requestStyle(); | |||
| setState(() {}); | |||
| } | |||
| void requestStyle() { | |||
| NetUtil.request("/api/v1/cfg/clipboard_unidentified", onSuccess: (data) { | |||
| _styleModel = NoGoodsDialogStyleModel.fromJson( | |||
| json.decode(data['clipboard_unidentified'])); | |||
| setState(() {}); | |||
| }); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return Scaffold( | |||
| backgroundColor: Colors.transparent, | |||
| body: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Stack( | |||
| backgroundColor: Colors.transparent, | |||
| body: InkWell( | |||
| onTap: () { | |||
| Navigator.of(context).pop(); | |||
| }, | |||
| child: Column( | |||
| mainAxisAlignment: MainAxisAlignment.center, | |||
| children: <Widget>[ | |||
| Container( | |||
| margin: EdgeInsets.only(top: 38.h, left: 92.w, right: 92.w), | |||
| padding: EdgeInsets.only( | |||
| top: (38 + 15).h, left: 30.w, right: 30.w, bottom: 48.h), | |||
| decoration: BoxDecoration( | |||
| color: Colors.white, | |||
| borderRadius: BorderRadius.circular(16)), | |||
| width: double.infinity, | |||
| child: Column( | |||
| children: <Widget>[_buildTopItem(), _buildBottomItem()], | |||
| ), | |||
| ), | |||
| Container( | |||
| height: 76.h, | |||
| child: Center( | |||
| child: Container( | |||
| color: Colors.red, | |||
| height: 76.h, | |||
| width: 216.w, | |||
| child: CachedNetworkImage( | |||
| imageUrl: "", | |||
| Stack( | |||
| children: <Widget>[ | |||
| Container( | |||
| margin: EdgeInsets.only(top: 38.h, left: 92.w, right: 92.w), | |||
| padding: EdgeInsets.only( | |||
| top: (38 + 15).h, | |||
| left: 30.w, | |||
| right: 30.w, | |||
| bottom: 48.h), | |||
| decoration: BoxDecoration( | |||
| color: HexColor.fromHex(_styleModel?.bgColor ?? ""), | |||
| borderRadius: BorderRadius.circular(16)), | |||
| width: double.infinity, | |||
| child: Column( | |||
| children: <Widget>[_buildTopItem(), _buildBottomItem()], | |||
| ), | |||
| ), | |||
| )), | |||
| ), | |||
| Container( | |||
| height: 76.h, | |||
| child: Center( | |||
| child: Container( | |||
| height: 76.h, | |||
| width: 216.w, | |||
| child: CachedNetworkImage( | |||
| imageUrl: _styleModel?.titleImg ?? "", | |||
| ), | |||
| )), | |||
| ), | |||
| ], | |||
| ) | |||
| ], | |||
| ) | |||
| ], | |||
| ), | |||
| ); | |||
| ), | |||
| )); | |||
| } | |||
| _buildTopItem() { | |||
| @@ -75,22 +101,30 @@ class _IntellectSearchNoGoodsDialogState | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Text( | |||
| "猜你要搜索以下商品", | |||
| style: TextStyle(color: Colors.red, fontSize: 30.sp), | |||
| _styleModel?.moduleList?.title?.content ?? "", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.title?.textColor ?? ""), | |||
| fontSize: 30.sp), | |||
| ), | |||
| Container( | |||
| margin: EdgeInsets.only(top: 12), | |||
| decoration: BoxDecoration( | |||
| color: Colors.deepOrangeAccent, | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.content?.bgColor ?? ""), | |||
| borderRadius: BorderRadius.circular(10)), | |||
| child: TextField( | |||
| controller: _textEditingController, | |||
| textAlign: TextAlign.start, | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.content?.textColor ?? ''), | |||
| fontSize: 22.sp), | |||
| decoration: InputDecoration( | |||
| contentPadding: EdgeInsets.only(left: 10, top: 10, bottom: 4), | |||
| border: InputBorder.none, | |||
| ), | |||
| maxLines: 5, | |||
| maxLines: 8, | |||
| ), | |||
| ) | |||
| ], | |||
| @@ -109,13 +143,18 @@ class _IntellectSearchNoGoodsDialogState | |||
| Expanded( | |||
| child: Container( | |||
| decoration: BoxDecoration( | |||
| color: Colors.red, borderRadius: BorderRadius.circular(50)), | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.btn?.bgColor ?? ""), | |||
| borderRadius: BorderRadius.circular(50)), | |||
| child: Center( | |||
| child: Padding( | |||
| padding: const EdgeInsets.all(12.0), | |||
| child: Text( | |||
| "立即搜索 ", | |||
| style: TextStyle(color: Colors.white, fontSize: 24.sp), | |||
| _styleModel?.moduleList?.btn?.content ?? "", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.btn?.textColor), | |||
| fontSize: 24.sp), | |||
| ), | |||
| )), | |||
| )) | |||
| @@ -130,13 +169,20 @@ class _IntellectSearchNoGoodsDialogState | |||
| Container( | |||
| height: 1, | |||
| width: 137.w, | |||
| color: Colors.deepOrange, | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.segment?.textColor ?? ""), | |||
| ), | |||
| Text( | |||
| _styleModel?.moduleList?.segment?.content ?? "", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.segment?.textColor ?? "")), | |||
| ), | |||
| Text("搜索平台"), | |||
| Container( | |||
| height: 1, | |||
| width: 137.w, | |||
| color: Colors.deepOrange, | |||
| color: HexColor.fromHex( | |||
| _styleModel?.moduleList?.segment?.textColor ?? ""), | |||
| ), | |||
| ], | |||
| ), | |||
| @@ -148,7 +194,7 @@ class _IntellectSearchNoGoodsDialogState | |||
| child: ListView.builder( | |||
| scrollDirection: Axis.horizontal, | |||
| shrinkWrap: true, | |||
| itemCount: 10, | |||
| itemCount: _styleModel?.iconList?.length ?? 0, | |||
| itemBuilder: _buildBottomListItem), | |||
| ) | |||
| ], | |||
| @@ -156,28 +202,34 @@ class _IntellectSearchNoGoodsDialogState | |||
| } | |||
| Widget _buildBottomListItem(BuildContext context, int index) { | |||
| var item = _styleModel.iconList[index]; | |||
| return Container( | |||
| margin: EdgeInsets.only(left: 11,right: 11), | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Container( | |||
| color: Colors.deepOrange, | |||
| child: Image.network( | |||
| "", | |||
| width: 60.w, | |||
| height: 60.w, | |||
| fit: BoxFit.fill, | |||
| ), | |||
| ), | |||
| SizedBox( | |||
| height: 2, | |||
| margin: EdgeInsets.only(left: 11, right: 11), | |||
| child: InkWell( | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Container( | |||
| color: Colors.deepOrange, | |||
| child: Image.network( | |||
| "", | |||
| width: 60.w, | |||
| height: 60.w, | |||
| fit: BoxFit.fill, | |||
| ), | |||
| ), | |||
| SizedBox( | |||
| height: 2, | |||
| ), | |||
| Text( | |||
| item.title ?? "", | |||
| style: TextStyle( | |||
| fontSize: 22.sp, | |||
| color: HexColor.fromHex(item.textColor ?? "")), | |||
| ) | |||
| ], | |||
| ), | |||
| Text( | |||
| "淘宝", | |||
| style: TextStyle(fontSize: 22.sp), | |||
| ) | |||
| ], | |||
| ), | |||
| ); | |||
| onTap: () {}, | |||
| )); | |||
| } | |||
| } | |||
| @@ -1,50 +1,78 @@ | |||
| ///智能粘贴板设置参数 | |||
| ///杨华轩 | |||
| class IntellectSearchSetModel { | |||
| List<String> exclude; | |||
| String keywordAlpha; | |||
| String keywordAlphanum; | |||
| String keywordLimitMax; | |||
| String keywordLimitMin; | |||
| String keywordLimitState; | |||
| String keywordNum; | |||
| List<String> pvd; | |||
| String state; | |||
| String isListen; | |||
| String isShiftUrl; | |||
| List<String> platform; | |||
| String isKeyLength; | |||
| String keyLengthMin; | |||
| String keyLengthMax; | |||
| String isNumber; | |||
| String numberMin; | |||
| String numberMax; | |||
| String isLetter; | |||
| String letterMin; | |||
| String letterMax; | |||
| String isNumAndLet; | |||
| String numAndLetMin; | |||
| String numAndLetMax; | |||
| List<String> banWords; | |||
| IntellectSearchSetModel( | |||
| {this.exclude, | |||
| this.keywordAlpha, | |||
| this.keywordAlphanum, | |||
| this.keywordLimitMax, | |||
| this.keywordLimitMin, | |||
| this.keywordLimitState, | |||
| this.keywordNum, | |||
| this.pvd, | |||
| this.state}); | |||
| {this.isListen, | |||
| this.isShiftUrl, | |||
| this.platform, | |||
| this.isKeyLength, | |||
| this.keyLengthMin, | |||
| this.keyLengthMax, | |||
| this.isNumber, | |||
| this.numberMin, | |||
| this.numberMax, | |||
| this.isLetter, | |||
| this.letterMin, | |||
| this.letterMax, | |||
| this.isNumAndLet, | |||
| this.numAndLetMin, | |||
| this.numAndLetMax, | |||
| this.banWords}); | |||
| IntellectSearchSetModel.fromJson(Map<String, dynamic> json) { | |||
| exclude = json['exclude'].cast<String>(); | |||
| keywordAlpha = json['keyword_alpha'].toString(); | |||
| keywordAlphanum = json['keyword_alphanum'].toString(); | |||
| keywordLimitMax = json['keyword_limit_max'].toString(); | |||
| keywordLimitMin = json['keyword_limit_min'].toString(); | |||
| keywordLimitState = json['keyword_limit_state'].toString(); | |||
| keywordNum = json['keyword_num'].toString(); | |||
| pvd = json['pvd'].cast<String>(); | |||
| state = json['state'].toString(); | |||
| isListen = json['isListen']; | |||
| isShiftUrl = json['isShiftUrl']; | |||
| platform = json['platform'].cast<String>(); | |||
| isKeyLength = json['isKeyLength']; | |||
| keyLengthMin = json['keyLengthMin']; | |||
| keyLengthMax = json['keyLengthMax']; | |||
| isNumber = json['isNumber']; | |||
| numberMin = json['numberMin']; | |||
| numberMax = json['numberMax']; | |||
| isLetter = json['isLetter']; | |||
| letterMin = json['letterMin']; | |||
| letterMax = json['letterMax']; | |||
| isNumAndLet = json['isNumAndLet']; | |||
| numAndLetMin = json['numAndLetMin']; | |||
| numAndLetMax = json['numAndLetMax']; | |||
| banWords = json['banWords'].cast<String>(); | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['exclude'] = this.exclude; | |||
| data['keyword_alpha'] = this.keywordAlpha; | |||
| data['keyword_alphanum'] = this.keywordAlphanum; | |||
| data['keyword_limit_max'] = this.keywordLimitMax; | |||
| data['keyword_limit_min'] = this.keywordLimitMin; | |||
| data['keyword_limit_state'] = this.keywordLimitState; | |||
| data['keyword_num'] = this.keywordNum; | |||
| data['pvd'] = this.pvd; | |||
| data['state'] = this.state; | |||
| data['isListen'] = this.isListen; | |||
| data['isShiftUrl'] = this.isShiftUrl; | |||
| data['platform'] = this.platform; | |||
| data['isKeyLength'] = this.isKeyLength; | |||
| data['keyLengthMin'] = this.keyLengthMin; | |||
| data['keyLengthMax'] = this.keyLengthMax; | |||
| data['isNumber'] = this.isNumber; | |||
| data['numberMin'] = this.numberMin; | |||
| data['numberMax'] = this.numberMax; | |||
| data['isLetter'] = this.isLetter; | |||
| data['letterMin'] = this.letterMin; | |||
| data['letterMax'] = this.letterMax; | |||
| data['isNumAndLet'] = this.isNumAndLet; | |||
| data['numAndLetMin'] = this.numAndLetMin; | |||
| data['numAndLetMax'] = this.numAndLetMax; | |||
| data['banWords'] = this.banWords; | |||
| return data; | |||
| } | |||
| } | |||
| @@ -0,0 +1,167 @@ | |||
| ///有商品弹窗model | |||
| class HasGoodsDialogStyleModel { | |||
| String titleImg; | |||
| String bgColor; | |||
| ModuleList moduleList; | |||
| HasGoodsDialogStyleModel({this.titleImg, this.bgColor, this.moduleList}); | |||
| HasGoodsDialogStyleModel.fromJson(Map<String, dynamic> json) { | |||
| titleImg = json['title_img']; | |||
| bgColor = json['bg_color']; | |||
| moduleList = json['module_list'] != null | |||
| ? new ModuleList.fromJson(json['module_list']) | |||
| : null; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['title_img'] = this.titleImg; | |||
| data['bg_color'] = this.bgColor; | |||
| if (this.moduleList != null) { | |||
| data['module_list'] = this.moduleList.toJson(); | |||
| } | |||
| return data; | |||
| } | |||
| } | |||
| class ModuleList { | |||
| Coupon coupon; | |||
| Coupon commission; | |||
| Coupon shopTitle; | |||
| Coupon couponPrice; | |||
| Coupon couponAfter; | |||
| Coupon couponAfterPrice; | |||
| SaveBtn saveBtn; | |||
| SaveBtn viewGoodsBtn; | |||
| ModuleList( | |||
| {this.coupon, | |||
| this.commission, | |||
| this.shopTitle, | |||
| this.couponPrice, | |||
| this.couponAfter, | |||
| this.couponAfterPrice, | |||
| this.saveBtn, | |||
| this.viewGoodsBtn}); | |||
| ModuleList.fromJson(Map<String, dynamic> json) { | |||
| coupon = | |||
| json['coupon'] != null ? new Coupon.fromJson(json['coupon']) : null; | |||
| commission = json['commission'] != null | |||
| ? new Coupon.fromJson(json['commission']) | |||
| : null; | |||
| shopTitle = json['shop_title'] != null | |||
| ? new Coupon.fromJson(json['shop_title']) | |||
| : null; | |||
| couponPrice = json['coupon_price'] != null | |||
| ? new Coupon.fromJson(json['coupon_price']) | |||
| : null; | |||
| couponAfter = json['coupon_after'] != null | |||
| ? new Coupon.fromJson(json['coupon_after']) | |||
| : null; | |||
| couponAfterPrice = json['coupon_after_price'] != null | |||
| ? new Coupon.fromJson(json['coupon_after_price']) | |||
| : null; | |||
| saveBtn = json['save_btn'] != null | |||
| ? new SaveBtn.fromJson(json['save_btn']) | |||
| : null; | |||
| viewGoodsBtn = json['view_goods_btn'] != null | |||
| ? new SaveBtn.fromJson(json['view_goods_btn']) | |||
| : null; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| if (this.coupon != null) { | |||
| data['coupon'] = this.coupon.toJson(); | |||
| } | |||
| if (this.commission != null) { | |||
| data['commission'] = this.commission.toJson(); | |||
| } | |||
| if (this.shopTitle != null) { | |||
| data['shop_title'] = this.shopTitle.toJson(); | |||
| } | |||
| if (this.couponPrice != null) { | |||
| data['coupon_price'] = this.couponPrice.toJson(); | |||
| } | |||
| if (this.couponAfter != null) { | |||
| data['coupon_after'] = this.couponAfter.toJson(); | |||
| } | |||
| if (this.couponAfterPrice != null) { | |||
| data['coupon_after_price'] = this.couponAfterPrice.toJson(); | |||
| } | |||
| if (this.saveBtn != null) { | |||
| data['save_btn'] = this.saveBtn.toJson(); | |||
| } | |||
| if (this.viewGoodsBtn != null) { | |||
| data['view_goods_btn'] = this.viewGoodsBtn.toJson(); | |||
| } | |||
| return data; | |||
| } | |||
| } | |||
| class Coupon { | |||
| String name; | |||
| String content; | |||
| String bgColor; | |||
| String bgImg; | |||
| String fontColor; | |||
| Coupon({this.name, this.content, this.bgColor, this.bgImg, this.fontColor}); | |||
| Coupon.fromJson(Map<String, dynamic> json) { | |||
| name = json['name']; | |||
| content = json['content']; | |||
| bgColor = json['bg_color']; | |||
| bgImg = json['bg_img']; | |||
| fontColor = json['font_color']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['name'] = this.name; | |||
| data['content'] = this.content; | |||
| data['bg_color'] = this.bgColor; | |||
| data['bg_img'] = this.bgImg; | |||
| data['font_color'] = this.fontColor; | |||
| return data; | |||
| } | |||
| } | |||
| class SaveBtn { | |||
| String name; | |||
| String content; | |||
| String type; | |||
| String bgColor; | |||
| String bgImg; | |||
| String fontColor; | |||
| SaveBtn( | |||
| {this.name, | |||
| this.content, | |||
| this.type, | |||
| this.bgColor, | |||
| this.bgImg, | |||
| this.fontColor}); | |||
| SaveBtn.fromJson(Map<String, dynamic> json) { | |||
| name = json['name']; | |||
| content = json['content']; | |||
| type = json['type']; | |||
| bgColor = json['bg_color']; | |||
| bgImg = json['bg_img']; | |||
| fontColor = json['font_color']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['name'] = this.name; | |||
| data['content'] = this.content; | |||
| data['type'] = this.type; | |||
| data['bg_color'] = this.bgColor; | |||
| data['bg_img'] = this.bgImg; | |||
| data['font_color'] = this.fontColor; | |||
| return data; | |||
| } | |||
| } | |||
| @@ -0,0 +1,52 @@ | |||
| class IntellectDialogDataModel { | |||
| String itemId; | |||
| String title; | |||
| String price; | |||
| String priceOriginal; | |||
| String commission; | |||
| String commissionRate; | |||
| String thumbnail; | |||
| String provider; | |||
| String couponUrl; | |||
| String couponPrice; | |||
| IntellectDialogDataModel( | |||
| {this.itemId, | |||
| this.title, | |||
| this.price, | |||
| this.priceOriginal, | |||
| this.commission, | |||
| this.commissionRate, | |||
| this.thumbnail, | |||
| this.provider, | |||
| this.couponUrl, | |||
| this.couponPrice}); | |||
| IntellectDialogDataModel.fromJson(Map<String, dynamic> json) { | |||
| itemId = json['item_id'].toString(); | |||
| title = json['title'].toString(); | |||
| price = json['price'].toString(); | |||
| priceOriginal = json['price_original'].toString(); | |||
| commission = json['commission'].toString(); | |||
| commissionRate = json['commission_rate'].toString(); | |||
| thumbnail = json['thumbnail'].toString(); | |||
| provider = json['provider'].toString(); | |||
| couponUrl = json['coupon_url'].toString(); | |||
| couponPrice = json['coupon_price'].toString(); | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['item_id'] = this.itemId; | |||
| data['title'] = this.title; | |||
| data['price'] = this.price; | |||
| data['price_original'] = this.priceOriginal; | |||
| data['commission'] = this.commission; | |||
| data['commission_rate'] = this.commissionRate; | |||
| data['thumbnail'] = this.thumbnail; | |||
| data['provider'] = this.provider; | |||
| data['coupon_url'] = this.couponUrl; | |||
| data['coupon_price'] = this.couponPrice; | |||
| return data; | |||
| } | |||
| } | |||
| @@ -0,0 +1,174 @@ | |||
| class NoGoodsDialogStyleModel { | |||
| String titleImg; | |||
| String bgColor; | |||
| List<IconList> iconList; | |||
| ModuleList moduleList; | |||
| NoGoodsDialogStyleModel( | |||
| {this.titleImg, this.bgColor, this.iconList, this.moduleList}); | |||
| NoGoodsDialogStyleModel.fromJson(Map<String, dynamic> json) { | |||
| titleImg = json['title_img']; | |||
| bgColor = json['bg_color']; | |||
| if (json['icon_list'] != null) { | |||
| iconList = new List<IconList>(); | |||
| json['icon_list'].forEach((v) { | |||
| iconList.add(new IconList.fromJson(v)); | |||
| }); | |||
| } | |||
| moduleList = json['module_list'] != null | |||
| ? new ModuleList.fromJson(json['module_list']) | |||
| : null; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['title_img'] = this.titleImg; | |||
| data['bg_color'] = this.bgColor; | |||
| if (this.iconList != null) { | |||
| data['icon_list'] = this.iconList.map((v) => v.toJson()).toList(); | |||
| } | |||
| if (this.moduleList != null) { | |||
| data['module_list'] = this.moduleList.toJson(); | |||
| } | |||
| return data; | |||
| } | |||
| } | |||
| class IconList { | |||
| String image; | |||
| String title; | |||
| String textColor; | |||
| IconList({this.image, this.title, this.textColor}); | |||
| IconList.fromJson(Map<String, dynamic> json) { | |||
| image = json['image']; | |||
| title = json['title']; | |||
| textColor = json['text_color']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['image'] = this.image; | |||
| data['title'] = this.title; | |||
| data['text_color'] = this.textColor; | |||
| return data; | |||
| } | |||
| } | |||
| class ModuleList { | |||
| Title title; | |||
| Title segment; | |||
| Content content; | |||
| Btn btn; | |||
| ModuleList({this.title, this.segment, this.content, this.btn}); | |||
| ModuleList.fromJson(Map<String, dynamic> json) { | |||
| title = json['title'] != null ? new Title.fromJson(json['title']) : null; | |||
| segment = | |||
| json['segment'] != null ? new Title.fromJson(json['segment']) : null; | |||
| content = | |||
| json['content'] != null ? new Content.fromJson(json['content']) : null; | |||
| btn = json['btn'] != null ? new Btn.fromJson(json['btn']) : null; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| if (this.title != null) { | |||
| data['title'] = this.title.toJson(); | |||
| } | |||
| if (this.segment != null) { | |||
| data['segment'] = this.segment.toJson(); | |||
| } | |||
| if (this.content != null) { | |||
| data['content'] = this.content.toJson(); | |||
| } | |||
| if (this.btn != null) { | |||
| data['btn'] = this.btn.toJson(); | |||
| } | |||
| return data; | |||
| } | |||
| } | |||
| class Title { | |||
| String name; | |||
| String content; | |||
| String textColor; | |||
| Title({this.name, this.content, this.textColor}); | |||
| Title.fromJson(Map<String, dynamic> json) { | |||
| name = json['name']; | |||
| content = json['content']; | |||
| textColor = json['text_color']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['name'] = this.name; | |||
| data['content'] = this.content; | |||
| data['text_color'] = this.textColor; | |||
| return data; | |||
| } | |||
| } | |||
| class Content { | |||
| String name; | |||
| String textColor; | |||
| String bgColor; | |||
| Content({this.name, this.textColor, this.bgColor}); | |||
| Content.fromJson(Map<String, dynamic> json) { | |||
| name = json['name']; | |||
| textColor = json['text_color']; | |||
| bgColor = json['bg_color']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['name'] = this.name; | |||
| data['text_color'] = this.textColor; | |||
| data['bg_color'] = this.bgColor; | |||
| return data; | |||
| } | |||
| } | |||
| class Btn { | |||
| String name; | |||
| String content; | |||
| String type; | |||
| String textColor; | |||
| String bgColor; | |||
| String bgImage; | |||
| Btn( | |||
| {this.name, | |||
| this.content, | |||
| this.type, | |||
| this.textColor, | |||
| this.bgColor, | |||
| this.bgImage}); | |||
| Btn.fromJson(Map<String, dynamic> json) { | |||
| name = json['name']; | |||
| content = json['content']; | |||
| type = json['type']; | |||
| textColor = json['text_color']; | |||
| bgColor = json['bg_color']; | |||
| bgImage = json['bg_image']; | |||
| } | |||
| Map<String, dynamic> toJson() { | |||
| final Map<String, dynamic> data = new Map<String, dynamic>(); | |||
| data['name'] = this.name; | |||
| data['content'] = this.content; | |||
| data['type'] = this.type; | |||
| data['text_color'] = this.textColor; | |||
| data['bg_color'] = this.bgColor; | |||
| data['bg_image'] = this.bgImage; | |||
| return data; | |||
| } | |||
| } | |||
| @@ -13,6 +13,8 @@ import 'package:zhiying_base_widget/widgets/others/mine_header_bg_widget.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import 'package:zhiying_comm/util/base_bloc.dart'; | |||
| import 'package:zhiying_comm/util/custom_sliver_persistent_header_delegate.dart'; | |||
| import 'package:zhiying_comm/zhiying_comm.dart'; | |||
| import 'package:flutter_alibc/flutter_alibc.dart'; | |||
| class BilDetailPage extends StatefulWidget { | |||
| final Map<String, dynamic> data; | |||
| @@ -59,12 +61,13 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> { | |||
| @override | |||
| void initState() { | |||
| _bloc = BlocProvider.of<BilDetailPageBloc>(context); | |||
| // showDate=DateFormat(DateFormat.YEAR_MONTH).parse(DateTime.now()); | |||
| showDate = DateFormat('yyyy-MM').format(DateTime.now()); | |||
| super.initState(); | |||
| } | |||
| @override | |||
| Widget build(BuildContext context) { | |||
| return StreamBuilder( | |||
| builder: (context, sny) { | |||
| return Scaffold( | |||
| @@ -75,9 +78,7 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> { | |||
| body: Container( | |||
| child: ListView( | |||
| shrinkWrap: true, | |||
| children: <Widget>[ | |||
| _buildType(), | |||
| ], | |||
| children: <Widget>[_buildType(), _buildBottomItem()], | |||
| ), | |||
| ), | |||
| ); | |||
| @@ -90,13 +91,13 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> { | |||
| children: <Widget>[ | |||
| SizedBox(width: 12.5), | |||
| InkWell( | |||
| onTap: (){ | |||
| onTap: () { | |||
| ///显示日期选择弹窗 | |||
| _selectDate(); | |||
| }, | |||
| child: Padding( | |||
| padding: const EdgeInsets.only(top: 8,bottom: 8), | |||
| child: Text("2020-08"), | |||
| padding: const EdgeInsets.only(top: 8, bottom: 8), | |||
| child: Text(showDate ?? ""), | |||
| ), | |||
| ), | |||
| Icon(Icons.arrow_drop_down), | |||
| @@ -108,9 +109,9 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> { | |||
| shrinkWrap: true, | |||
| itemCount: 3, | |||
| itemBuilder: (context, index) { | |||
| return Container( | |||
| return InkWell(child: Container( | |||
| margin: | |||
| EdgeInsets.only(top: 10, left: 8, right: 8, bottom: 10), | |||
| EdgeInsets.only(top: 10, left: 8, right: 8, bottom: 10), | |||
| decoration: BoxDecoration( | |||
| color: Colors.grey[200], | |||
| borderRadius: BorderRadius.circular(50)), | |||
| @@ -118,18 +119,148 @@ class _BilDetailPageContainerState extends State<BilDetailPageContainer> { | |||
| padding: const EdgeInsets.only(left: 16, right: 16), | |||
| child: Center( | |||
| child: Text( | |||
| "推广", | |||
| style: TextStyle(color: Colors.grey), | |||
| )), | |||
| "推广", | |||
| style: TextStyle(color: Colors.grey), | |||
| )), | |||
| ), | |||
| ); | |||
| ),onTap: () async { | |||
| print("ok"); | |||
| await FlutterAlibc.loginTaoBao(); | |||
| },); | |||
| }), | |||
| )) | |||
| ], | |||
| ); | |||
| } | |||
| void _selectDate() { | |||
| showDialog(context: context, builder: (context)=>SelectDateYMDialog()); | |||
| void _selectDate() async { | |||
| showDialog(context: context, builder: (context) => SelectDateYMDialog()); | |||
| } | |||
| _buildBottomItem() { | |||
| return ListView.builder( | |||
| shrinkWrap: true, itemCount: 10, itemBuilder: _buildItem); | |||
| } | |||
| Widget _buildItem(BuildContext context, int index) { | |||
| return Container( | |||
| margin: EdgeInsets.only(left: 12.5, right: 12.5, bottom: 4, top: 4), | |||
| padding: | |||
| EdgeInsets.only(left: 25.w, right: 25.w, top: 20.h, bottom: 20.h), | |||
| child: Column( | |||
| children: <Widget>[ | |||
| Row( | |||
| mainAxisAlignment: MainAxisAlignment.spaceBetween, | |||
| children: <Widget>[ | |||
| Row( | |||
| children: <Widget>[ | |||
| Container( | |||
| decoration: BoxDecoration( | |||
| borderRadius: BorderRadius.circular(4), | |||
| color: Colors.red[100], | |||
| border: Border.all(color: Colors.red)), | |||
| child: Padding( | |||
| padding: const EdgeInsets.only( | |||
| left: 4, right: 4, top: 2, bottom: 2), | |||
| child: Center( | |||
| child: Text( | |||
| "自购", | |||
| style: TextStyle(color: Colors.red, fontSize: 20.sp), | |||
| ), | |||
| ), | |||
| ), | |||
| ), | |||
| Container( | |||
| width: 443.w, | |||
| margin: EdgeInsets.only(left: 15.w), | |||
| child: Text( | |||
| "Segway Ninebot mini Pro智能代的卅饭店发生的范德萨地方撒发生", | |||
| maxLines: 1, | |||
| overflow: TextOverflow.ellipsis, | |||
| style: TextStyle(fontSize: 28.sp), | |||
| )) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Text( | |||
| "+", | |||
| style: TextStyle(color: Colors.red), | |||
| ), | |||
| Text( | |||
| "¥8.00", | |||
| style: TextStyle(color: Colors.red, fontSize: 30.sp), | |||
| ) | |||
| ], | |||
| ) | |||
| ], | |||
| ), | |||
| SizedBox( | |||
| height: 4, | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Text( | |||
| "订单编号:", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| Text( | |||
| "1233333333", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| SizedBox( | |||
| width: 28.w, | |||
| ), | |||
| Container( | |||
| decoration: BoxDecoration( | |||
| borderRadius: BorderRadius.circular(4), | |||
| color: HexColor.fromHex("#FFF5F5F5"), | |||
| border: Border.all(color: HexColor.fromHex("#FFD6D6D6"))), | |||
| child: Padding( | |||
| padding: | |||
| EdgeInsets.only(left: 16, right: 16, top: 1, bottom: 1), | |||
| child: Text( | |||
| "复制", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| ), | |||
| ) | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Text( | |||
| "订单编号:", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| Text( | |||
| "1233333333", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| ], | |||
| ), | |||
| Row( | |||
| children: <Widget>[ | |||
| Text( | |||
| "订单编号:", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| Text( | |||
| "1233333333", | |||
| style: TextStyle( | |||
| color: HexColor.fromHex("#FF999999"), fontSize: 22.sp), | |||
| ), | |||
| ], | |||
| ) | |||
| ], | |||
| ), | |||
| ); | |||
| } | |||
| } | |||
| @@ -70,7 +70,7 @@ class _MainPageContainerState extends State<_MainPageContainer> | |||
| @override | |||
| void didChangeAppLifecycleState(AppLifecycleState state) async { | |||
| ///智能粘贴板 | |||
| // IntellectCreate.checkAndCreate(state, context); | |||
| IntellectCreate.checkAndCreate(state, context); | |||
| super.didChangeAppLifecycleState(state); | |||
| } | |||
| @@ -102,7 +102,7 @@ class _MainPageContainerState extends State<_MainPageContainer> | |||
| } | |||
| }); | |||
| ///监听app生命周期变化 | |||
| // WidgetsBinding.instance.addObserver(this); | |||
| WidgetsBinding.instance.addObserver(this); | |||
| IntellectCreate.checkAndCreateFirst(context); | |||
| super.initState(); | |||
| } | |||
| @@ -1,4 +1,5 @@ | |||
| import 'package:sharesdk_plugin/sharesdk_plugin.dart'; | |||
| import 'package:sharesdk_plugin/sharesdk_interface.dart'; | |||
| import 'package:sharesdk_plugin/sharesdk_register.dart'; | |||
| import 'package:zhiying_base_widget/pages/bil_detail_page/bil_detail_page.dart'; | |||
| import 'package:zhiying_base_widget/pages/favorite_page/favorite_page.dart'; | |||
| import 'package:flutter/cupertino.dart'; | |||
| @@ -68,7 +69,6 @@ import 'widgets/search/tabbar/search_tab_widget.dart'; | |||
| import 'widgets/search_result/goods_list/search_result_goods_list_widget.dart'; | |||
| import 'widgets/search_result/search_input/search_result_input.dart'; | |||
| class BaseWidgetRegister { | |||
| /// 初始化方法 | |||
| static void init() { | |||
| @@ -101,12 +101,13 @@ class BaseWidgetRegister { | |||
| PageFactory.regist('pub.flutter.index', (model) => MainPage(model)); | |||
| PageFactory.regist('pub.flutter.profile', (model) => MainPage(model)); | |||
| PageFactory.regist( | |||
| 'pub.flutter.my_wallet', (model) => BilDetailPage(model)); | |||
| 'pub.flutter.my_wallet', (model) => WalletPage(data: model)); | |||
| PageFactory.regist('goods_details', (model) => GoodsDetailsPage(model)); | |||
| PageFactory.regist('search', (model) => SearchPage(model)); | |||
| PageFactory.regist('search_item_page', (model) => SearchItemPage(model)); | |||
| PageFactory.regist('search_result', (model) => SearchResultPage(model)); | |||
| PageFactory.regist('search_result_item', (model) => SearchResultItemPage(model)); | |||
| PageFactory.regist( | |||
| 'search_result_item', (model) => SearchResultItemPage(model)); | |||
| // PageFactory.regist('search_think_page', (model) => SearchThinkPage(model)); | |||
| // PageFactory.regist('login', (model) => LoginPage(model)); | |||
| // PageFactory.regist('login_quick', (model) => LoginQuickPage(model)); | |||
| @@ -155,10 +156,12 @@ class BaseWidgetRegister { | |||
| WidgetFactory.regist('index_recommend_list', GoodsListCreater()); | |||
| /// 首页快速入口 | |||
| WidgetFactory.regist('multi_nav', DefaultWidgetCreater((model) => HomeQuickEntry(model))); | |||
| WidgetFactory.regist( | |||
| 'multi_nav', DefaultWidgetCreater((model) => HomeQuickEntry(model))); | |||
| /// 滚动公告 | |||
| WidgetFactory.regist('index_placard', DefaultWidgetCreater((model) => HomeNoticeWidget(model))); | |||
| WidgetFactory.regist('index_placard', | |||
| DefaultWidgetCreater((model) => HomeNoticeWidget(model))); | |||
| /// 不可以滚动banner | |||
| WidgetFactory.regist('index_banner_one', HomeBannerCreater()); | |||
| @@ -169,81 +172,113 @@ class BaseWidgetRegister { | |||
| // 搜索标题 | |||
| // WidgetFactory.regist('search_index_app_bar', DefaultWidgetCreater((model) => SearchAppbarWidget(model))); | |||
| // 搜索输入框 | |||
| WidgetFactory.regist('search_index_input', DefaultWidgetCreater((model) => SearchInputWidget(model))); | |||
| WidgetFactory.regist('search_index_input', | |||
| DefaultWidgetCreater((model) => SearchInputWidget(model))); | |||
| // // 搜索tabBar | |||
| WidgetFactory.regist('search_index_icon_list', SearcchTabCreater()); | |||
| // WidgetFactory.regist('search_index_icon_list', DefaultWidgetCreater((model) => SearchTabWidget(model))); | |||
| // // 热门搜索标签 | |||
| WidgetFactory.regist('search_index_host_keyword', DefaultWidgetCreater((model) => SearchHotTagWidget(model))); | |||
| WidgetFactory.regist('search_index_host_keyword', | |||
| DefaultWidgetCreater((model) => SearchHotTagWidget(model))); | |||
| // // 历史搜索标签 | |||
| WidgetFactory.regist('search_index_history', DefaultWidgetCreater((model) => SearchHistoryTagWidget(model))); | |||
| WidgetFactory.regist('search_index_history', | |||
| DefaultWidgetCreater((model) => SearchHistoryTagWidget(model))); | |||
| /// ==================== 搜索结果页面 ==================== /// | |||
| // 输入框 | |||
| WidgetFactory.regist('search_result_input', DefaultWidgetCreater((model) => SearchResultInputWidget(model))); | |||
| WidgetFactory.regist('search_result_input', | |||
| DefaultWidgetCreater((model) => SearchResultInputWidget(model))); | |||
| // tabbar | |||
| WidgetFactory.regist('search_result_icon_list', SearchResultTabCreater()); | |||
| // 搜索结果页筛选widget 淘宝 | |||
| WidgetFactory.regist('search_result_taobao_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_taobao_sort', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 淘宝 | |||
| WidgetFactory.regist('search_result_taobao_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_taobao_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| // 搜索结果页筛选widget 京东 | |||
| WidgetFactory.regist('search_result_jd_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_jd_sort', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 京东 | |||
| WidgetFactory.regist('search_result_jd_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_jd_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| // 搜索结果页筛选widget 苏宁 | |||
| WidgetFactory.regist('search_result_suning_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_suning_sort', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 苏宁 | |||
| WidgetFactory.regist('search_result_suning_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_suning_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| // 搜索结果页筛选widget 拼多多 | |||
| WidgetFactory.regist('search_result_pdd_sort', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_pdd_sort', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 拼多多 | |||
| WidgetFactory.regist('search_result_pdd_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_pdd_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| // 搜索结果页筛选widget 唯品会 | |||
| WidgetFactory.regist('search_result_vip', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_vip', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 唯品会 | |||
| WidgetFactory.regist('search_result_vip_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_vip_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| // 搜索结果页筛选widget 考拉 | |||
| WidgetFactory.regist('search_result_kaola', DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| WidgetFactory.regist('search_result_kaola', | |||
| DefaultWidgetCreater((model) => SearchResultSortWidget(model))); | |||
| // 搜索结果的商品列表 考拉 | |||
| WidgetFactory.regist('search_result_kaola_item', DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| WidgetFactory.regist('search_result_kaola_item', | |||
| DefaultWidgetCreater((model) => SearchResultGoodsListWidget(model))); | |||
| /// ==================== 商品详情 ==================== /// | |||
| // 商品详情轮播图 | |||
| WidgetFactory.regist('product_detail_carousel', DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | |||
| WidgetFactory.regist('product_detail_carousel', | |||
| DefaultWidgetCreater((model) => GoodsDetailsSlideBannerWidget(model))); | |||
| // 商品详情下载APP提示 | |||
| WidgetFactory.regist('product_detail_download_tips', DefaultWidgetCreater((model) => UpgradeTipWidget(model))); | |||
| WidgetFactory.regist('product_detail_download_tips', | |||
| DefaultWidgetCreater((model) => UpgradeTipWidget(model))); | |||
| // 商品详情价格显示 | |||
| WidgetFactory.regist('product_detail_price', DefaultWidgetCreater((model) => GoodsDetailsPriceWidget(model))); | |||
| WidgetFactory.regist('product_detail_price', | |||
| DefaultWidgetCreater((model) => GoodsDetailsPriceWidget(model))); | |||
| // 商品详情标题 | |||
| WidgetFactory.regist('product_detail_title', DefaultWidgetCreater((model) => GoodsDetailsTitleWidget(model))); | |||
| WidgetFactory.regist('product_detail_title', | |||
| DefaultWidgetCreater((model) => GoodsDetailsTitleWidget(model))); | |||
| // 商品详情优惠劵 | |||
| WidgetFactory.regist('product_detail_coupon', DefaultWidgetCreater((model) => CounponWidget(model))); | |||
| WidgetFactory.regist('product_detail_coupon', | |||
| DefaultWidgetCreater((model) => CounponWidget(model))); | |||
| // 商品详情店铺 | |||
| WidgetFactory.regist('product_detail_shop', DefaultWidgetCreater((model) => StoreWidget(model))); | |||
| WidgetFactory.regist('product_detail_shop', | |||
| DefaultWidgetCreater((model) => StoreWidget(model))); | |||
| // 商品详情宝贝评价 | |||
| WidgetFactory.regist('product_detail_comment', DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | |||
| WidgetFactory.regist('product_detail_comment', | |||
| DefaultWidgetCreater((model) => GoodsDetailsEvaluateWidget(model))); | |||
| // 商品详情图片 | |||
| WidgetFactory.regist('product_detail_img_list', DefaultWidgetCreater((model) => GoodsDetailsImgWidget(model))); | |||
| WidgetFactory.regist('product_detail_img_list', | |||
| DefaultWidgetCreater((model) => GoodsDetailsImgWidget(model))); | |||
| // 商品详情底部推荐列表 | |||
| WidgetFactory.regist('product_detail_bottom_rec', GoodsDetailCommendCreater()); | |||
| WidgetFactory.regist( | |||
| 'product_detail_bottom_rec', GoodsDetailCommendCreater()); | |||
| // 商品详情底部 | |||
| WidgetFactory.regist('product_detail_bottom', DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | |||
| WidgetFactory.regist('product_detail_bottom', | |||
| DefaultWidgetCreater((model) => GoodsDetailsFooterWidget(model))); | |||
| // ==================== 个人中心 | |||
| WidgetFactory.regist('profile_appbar', MineNavCreater()); | |||
| WidgetFactory.regist('profile_background', DefaultWidgetCreater((model) => MineNavBg(model))); | |||
| WidgetFactory.regist('profile_header', DefaultWidgetCreater((model) => MineHeader(model))); | |||
| WidgetFactory.regist('profile_earning', DefaultWidgetCreater((model) => MineData(model))); | |||
| WidgetFactory.regist('profile_functions', DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||
| WidgetFactory.regist('profile_my_functions', DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||
| WidgetFactory.regist('profile_carousel', DefaultWidgetCreater((model) => HomeBannerWidget(model))); | |||
| WidgetFactory.regist('profile_background', | |||
| DefaultWidgetCreater((model) => MineNavBg(model))); | |||
| WidgetFactory.regist( | |||
| 'profile_header', DefaultWidgetCreater((model) => MineHeader(model))); | |||
| WidgetFactory.regist( | |||
| 'profile_earning', DefaultWidgetCreater((model) => MineData(model))); | |||
| WidgetFactory.regist('profile_functions', | |||
| DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||
| WidgetFactory.regist('profile_my_functions', | |||
| DefaultWidgetCreater((model) => MineQuickEntry(model))); | |||
| WidgetFactory.regist('profile_carousel', | |||
| DefaultWidgetCreater((model) => HomeBannerWidget(model))); | |||
| // ==================== 钱包 | |||
| WidgetFactory.regist( | |||
| @@ -187,7 +187,7 @@ class _ShareAlertContentState extends State<_ShareAlertContent> { | |||
| ], | |||
| ), | |||
| ), | |||
| onTap: () { | |||
| onTap: () async { | |||
| //检查是否有存储权限 | |||
| var status = await Permission.storage.status; | |||
| if (!status.isGranted) { | |||
| @@ -31,15 +31,15 @@ dependencies: | |||
| flutter_native_image: ^0.0.5 | |||
| #字符检测 | |||
| string_validator: 0.1.4 | |||
| intl: 0.15.7 | |||
| permission_handler: | |||
| git: | |||
| ref: 0.0.1 | |||
| url: http://192.168.0.138:3000/FnuoOS_Flutter_Components/permission_handler.git | |||
| zhiying_comm: | |||
| path: ../zhiying_comm | |||
| intl: 0.16.0 | |||
| dev_dependencies: | |||
| flutter_test: | |||