Commit c96569437747e572e602ac94c522ee8b154df135

Authored by wdn127929
2 parents 619fa9df b6a2a112

屏蔽多时段设置

... ... @@ -553,8 +553,9 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6000;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 5424;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
... ... @@ -704,8 +705,9 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "Runner/一键订Debug.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6000;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 5424;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = debug;
... ... @@ -746,8 +748,9 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6000;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 5424;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
... ...
... ... @@ -477,4 +477,4 @@
"sms_statistics": "SMS Statistics",
"recharge_instructions": "Recharge Instructions",
"warm_reminder": "Warm Reminder"
}
\ No newline at end of file
}
... ...
... ... @@ -103,11 +103,21 @@ class Guest extends Object {
@JsonKey(name: 'is_member')
String isMember;
@JsonKey(name: 'c_day_self')
String cDaySelf;
String get rnameStr {
if (rname == null || rname == '' || rname == ' ') return "";
return rname;
}
String get cdaySelfStr {
if (cDaySelf == null || cDaySelf == '') return '';
return DateUtil.formatDate(
DateTime.fromMillisecondsSinceEpoch(int.parse(cDaySelf) * 1000),
format: DateFormats.y_mo_d);
}
String get sexStr {
if (sex == null || sex == '' || sex == '0') return "先生";
switch (sex.toString()) {
... ... @@ -146,7 +156,8 @@ class Guest extends Object {
this.udate,
this.label,
this.nickName,
this.isMember);
this.isMember,
this.cDaySelf);
factory Guest.fromJson(Map<String, dynamic> srcJson) =>
_$GuestFromJson(srcJson);
... ...
... ... @@ -76,6 +76,7 @@ Guest _$GuestFromJson(Map<String, dynamic> json) {
json['label'] as String,
json['nick_name'] as String,
json['is_member'] as String,
json['c_day_self'] as String,
);
}
... ... @@ -97,7 +98,8 @@ Map<String, dynamic> _$GuestToJson(Guest instance) => <String, dynamic>{
'udate': instance.udate,
'label': instance.label,
'nick_name': instance.nickName,
'is_member': instance.isMember
'is_member': instance.isMember,
'c_day_self': instance.cDaySelf
};
Cday _$CdayFromJson(Map<String, dynamic> json) {
... ...
class SaiYouYunBirthdayModel {
final int ret;
final List<SaiYouYunBirthdaySunModel> data;
final String msg;
const SaiYouYunBirthdayModel({this.ret, this.data, this.msg});
SaiYouYunBirthdayModel copyWith(
{int ret, List<SaiYouYunBirthdaySunModel> data, String msg}) {
return SaiYouYunBirthdayModel(
ret: ret ?? this.ret, data: data ?? this.data, msg: msg ?? this.msg);
}
Map<String, Object> toJson() {
return {
'ret': ret,
'data': data?.map<Map<String, dynamic>>((data) => data.toJson()).toList(),
'msg': msg
};
}
static SaiYouYunBirthdayModel fromJson(Map<String, Object> json) {
return SaiYouYunBirthdayModel(
ret: json['ret'] == null ? null : json['ret'] as int,
data: json['data'] == null
? null
: (json['data'] as List)
.map<SaiYouYunBirthdaySunModel>((data) =>
SaiYouYunBirthdaySunModel.fromJson(
data as Map<String, Object>))
.toList(),
msg: json['msg'] == null ? null : json['msg'] as String);
}
@override
String toString() {
return '''SaiYouYunBirthdayModel(
ret:$ret,
data:${data.toString()},
msg:$msg
) ''';
}
@override
bool operator ==(Object other) {
return other is SaiYouYunBirthdayModel &&
other.runtimeType == runtimeType &&
other.ret == ret &&
other.data == data &&
other.msg == msg;
}
@override
int get hashCode {
return Object.hash(runtimeType, ret, data, msg);
}
}
class SaiYouYunBirthdaySunModel {
final String id;
final String templateCode;
final String templateParam;
final dynamic templateDemo;
final String type;
final dynamic bestwish;
const SaiYouYunBirthdaySunModel({
this.id,
this.templateCode,
this.templateParam,
this.templateDemo,
this.type,
this.bestwish,
});
SaiYouYunBirthdaySunModel copyWith({
String id,
String templateCode,
String templateParam,
dynamic templateDemo,
String type,
dynamic bestwish,
}) {
return SaiYouYunBirthdaySunModel(
id: id ?? this.id,
templateCode: templateCode ?? this.templateCode,
templateParam: templateParam ?? this.templateParam,
templateDemo: templateDemo ?? this.templateDemo,
type: type ?? this.type,
bestwish: bestwish ?? this.bestwish,
);
}
Map<String, Object> toJson() {
return {
'id': id,
'template_code': templateCode,
'template_param': templateParam,
'template_demo': templateDemo,
'type': type,
'bestwish': bestwish
};
}
static SaiYouYunBirthdaySunModel fromJson(Map<String, Object> json) {
return SaiYouYunBirthdaySunModel(
id: json['id'] == null ? null : json['id'] as String,
templateCode: json['template_code'] == null
? null
: json['template_code'] as String,
templateParam: json['template_param'] == null
? null
: json['template_param'] as String,
templateDemo: json['template_demo'] as dynamic,
type: json['type'] == null ? null : json['type'] as String,
bestwish: json['bestwish'] as dynamic);
}
@override
String toString() {
return '''Data(
id:$id,
templateCode:$templateCode,
templateParam:$templateParam,
templateDemo:$templateDemo,
type:$type,
bestwish:$bestwish
) ''';
}
@override
bool operator ==(Object other) {
return other is SaiYouYunBirthdaySunModel &&
other.runtimeType == runtimeType &&
other.id == id &&
other.templateCode == templateCode &&
other.templateParam == templateParam &&
other.templateDemo == templateDemo &&
other.type == type &&
other.bestwish == bestwish;
}
@override
int get hashCode {
return Object.hash(runtimeType, id, templateCode, templateParam,
templateDemo, type, bestwish);
}
}
... ...
class SellerGuestModel {
final int ret;
final SellerGuestSunModel data;
final String msg;
const SellerGuestModel({this.ret, this.data, this.msg});
SellerGuestModel copyWith({int ret, SellerGuestSunModel data, String msg}) {
return SellerGuestModel(
ret: ret ?? this.ret, data: data ?? this.data, msg: msg ?? this.msg);
}
Map<String, Object> toJson() {
return {'ret': ret, 'data': data?.toJson(), 'msg': msg};
}
static SellerGuestModel fromJson(Map<String, Object> json) {
return SellerGuestModel(
ret: json['ret'] == null ? null : json['ret'] as int,
data: json['data'] == null
? null
: SellerGuestSunModel.fromJson(json['data'] as Map<String, Object>),
msg: json['msg'] == null ? null : json['msg'] as String);
}
@override
String toString() {
return '''SellerGuestModel(
ret:$ret,
data:${data.toString()},
msg:$msg
) ''';
}
@override
bool operator ==(Object other) {
return other is SellerGuestModel &&
other.runtimeType == runtimeType &&
other.ret == ret &&
other.data == data &&
other.msg == msg;
}
@override
int get hashCode {
return Object.hash(runtimeType, ret, data, msg);
}
}
class SellerGuestSunModel {
final String id;
final String sellerid;
final String isAdditional;
final String isEnterSelf;
final dynamic birthdayAdvNotice;
final dynamic birthdayAdvNoticeSms;
final dynamic birthdayNotice;
final dynamic birthdayNoticeDay;
final dynamic commemorationDay;
final dynamic commemorationNotice;
const SellerGuestSunModel(
{this.id,
this.sellerid,
this.isAdditional,
this.isEnterSelf,
this.birthdayAdvNotice,
this.birthdayAdvNoticeSms,
this.birthdayNotice,
this.birthdayNoticeDay,
this.commemorationDay,
this.commemorationNotice});
SellerGuestSunModel copyWith(
{String id,
String sellerid,
String isAdditional,
String isEnterSelf,
dynamic birthdayAdvNotice,
dynamic birthdayAdvNoticeSms,
dynamic birthdayNotice,
dynamic birthdayNoticeDay,
dynamic commemorationDay,
dynamic commemorationNotice}) {
return SellerGuestSunModel(
id: id ?? this.id,
sellerid: sellerid ?? this.sellerid,
isAdditional: isAdditional ?? this.isAdditional,
isEnterSelf: isEnterSelf ?? this.isEnterSelf,
birthdayAdvNotice: birthdayAdvNotice ?? this.birthdayAdvNotice,
birthdayAdvNoticeSms: birthdayAdvNoticeSms ?? this.birthdayAdvNoticeSms,
birthdayNotice: birthdayNotice ?? this.birthdayNotice,
birthdayNoticeDay: birthdayNoticeDay ?? this.birthdayNoticeDay,
commemorationDay: commemorationDay ?? this.commemorationDay,
commemorationNotice: commemorationNotice ?? this.commemorationNotice);
}
Map<String, Object> toJson() {
return {
'id': id,
'sellerid': sellerid,
'is_additional': isAdditional,
'is_enter_self': isEnterSelf,
'birthday_adv_notice': birthdayAdvNotice,
'birthday_adv_notice_sms': birthdayAdvNoticeSms,
'birthday_notice': birthdayNotice,
'birthday_notice_day': birthdayNoticeDay,
'commemoration_day': commemorationDay,
'commemoration_notice': commemorationNotice
};
}
static SellerGuestSunModel fromJson(Map<String, Object> json) {
return SellerGuestSunModel(
id: json['id'] == null ? null : json['id'] as String,
sellerid: json['sellerid'] == null ? null : json['sellerid'] as String,
isAdditional: json['is_additional'] == null
? null
: json['is_additional'] as String,
isEnterSelf: json['is_enter_self'] == null
? null
: json['is_enter_self'] as String,
birthdayAdvNotice: json['birthday_adv_notice'] as dynamic,
birthdayAdvNoticeSms: json['birthday_adv_notice_sms'] as dynamic,
birthdayNotice: json['birthday_notice'] as dynamic,
birthdayNoticeDay: json['birthday_notice_day'] as dynamic,
commemorationDay: json['commemoration_day'] as dynamic,
commemorationNotice: json['commemoration_notice'] as dynamic);
}
@override
String toString() {
return '''Data(
id:$id,
sellerid:$sellerid,
isAdditional:$isAdditional,
isEnterSelf:$isEnterSelf,
birthdayAdvNotice:$birthdayAdvNotice,
birthdayAdvNoticeSms:$birthdayAdvNoticeSms,
birthdayNotice:$birthdayNotice,
birthdayNoticeDay:$birthdayNoticeDay,
commemorationDay:$commemorationDay,
commemorationNotice:$commemorationNotice
) ''';
}
@override
bool operator ==(Object other) {
return other is SellerGuestSunModel &&
other.runtimeType == runtimeType &&
other.id == id &&
other.sellerid == sellerid &&
other.isAdditional == isAdditional &&
other.isEnterSelf == isEnterSelf &&
other.birthdayAdvNotice == birthdayAdvNotice &&
other.birthdayAdvNoticeSms == birthdayAdvNoticeSms &&
other.birthdayNotice == birthdayNotice &&
other.birthdayNoticeDay == birthdayNoticeDay &&
other.commemorationDay == commemorationDay &&
other.commemorationNotice == commemorationNotice;
}
@override
int get hashCode {
return Object.hash(
runtimeType,
id,
sellerid,
isAdditional,
isEnterSelf,
birthdayAdvNotice,
birthdayAdvNoticeSms,
birthdayNotice,
birthdayNoticeDay,
commemorationDay,
commemorationNotice);
}
}
... ...
... ... @@ -583,6 +583,16 @@ class HttpUrl {
static const get_meal_section_by_day =
"?service=App.Seller.getMealSectionByDay"; // 获取日期对应的时段
static const get_sai_you_yun_birthday_temp =
"?service=App.GuestManage.GetSaiYouYunBirthdayTemp"; // 获取客户生日提醒短信模板配置内容
static const set_sai_you_yun_birthday =
"?service=App.GuestManage.SetSaiYouYunBirthday"; // 客户生日提醒短信模板
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_picker/Picker.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/customer_list_model.dart';
... ... @@ -41,7 +43,8 @@ class MyCustomerDetailPage extends StatefulWidget {
class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
ScrollController controller = ScrollController();
CustomerProvider customerProvider;
String birthday = '';
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
... ... @@ -67,6 +70,8 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
'phone': widget.userHistoryEntity.phone
};
await customerProvider.getGuestInfo(context, params);
birthday = customerProvider.guestInfoSunModel.guest.cdaySelfStr;
setState(() {});
// await customerProvider.searchData(customerProvider.controller.text);
}
... ... @@ -190,7 +195,8 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
)),
],
),
customerProvider.guestInfoSunModel.guest.label != null &&customerProvider.guestInfoSunModel.guest.label != ''
customerProvider.guestInfoSunModel.guest.label != null &&
customerProvider.guestInfoSunModel.guest.label != ''
? Container(
padding: EdgeInsets.only(top: ScreenUtil().setWidth(10)),
constraints:
... ... @@ -290,7 +296,8 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
fontSize: ScreenUtil().setSp(20)))));
}
if (customerProvider.guestInfoSunModel.guest.label != null&&customerProvider.guestInfoSunModel.guest.label != '') {
if (customerProvider.guestInfoSunModel.guest.label != null &&
customerProvider.guestInfoSunModel.guest.label != '') {
List<String> labels =
customerProvider.guestInfoSunModel.guest.label.split(',');
labels.forEach((element) {
... ... @@ -580,15 +587,18 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
crossAxisAlignment: WrapCrossAlignment.center,
children: [
Text(
customerProvider.guestInfoSunModel.last?.ddate == null ? '': Utils.formatFromMill(
customerProvider.guestInfoSunModel.last?.ddate,context),
customerProvider.guestInfoSunModel.last?.ddate == null
? ''
: Utils.formatFromMill(
customerProvider.guestInfoSunModel.last?.ddate,context),
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_E34D59),
),
Text(
customerProvider.guestInfoSunModel.last?.ddateSoltStr??"",
customerProvider.guestInfoSunModel.last?.ddateSoltStr ??
"",
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_438E93),
... ... @@ -600,7 +610,8 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
color: MyColours.color_515151),
),
Text(
customerProvider.guestInfoSunModel.last?.tableinfoName??'',
customerProvider.guestInfoSunModel.last?.tableinfoName ??
'',
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_438E93),
... ... @@ -730,8 +741,8 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
isBold: true,
height: w(22),
onPressed: () {
NavigatorUtil.goWineDetailPage(context,
customerProvider.guestInfoSunModel.store.id,
NavigatorUtil.goWineDetailPage(
context, customerProvider.guestInfoSunModel.store.id,
onlyShow: true);
},
)
... ... @@ -762,6 +773,7 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: Color.fromRGBO(246, 248, 250, 1),
key: scaffoldKey,
appBar: SystemAppBar(
S.of(context).customer_details,
onTap: () {
... ... @@ -948,6 +960,78 @@ class _MyCustomerDetailPageState extends State<MyCustomerDetailPage> {
'${customerProvider.guestInfoSunModel.guest.serve == null ? '' : customerProvider.guestInfoSunModel.guest.serve}'),
VEmptyView(20),
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(30)),
color: MyColours.color_ffffff,
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'生日',
style: TextStyle(
fontSize: ScreenUtil().setSp(36),
color: MyColours.color_333333),
),
Spacer(),
Text(
birthday,
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
HEmptyView(20),
RoundButton(
text: '编辑',
radius: ScreenUtil().setWidth(20),
width: ScreenUtil().setWidth(90),
height: ScreenUtil().setWidth(50),
fontSize: 26,
isBold: false,
onPressed: () {
DialogUtil.showPickerDateTime24(
context,
scaffoldKey,
(value) async {
// {'text': picker.adapter.text, 'select': selecteds}
if (value != null) {
setState(() {
print(value);
birthday = DateUtil.formatDateStr(value,
format: DateFormats.y_mo_d);
});
// 请求接口,设置生日
String from = birthday + ' 00:00:00';
Map<String, String> params = {
'id': widget.userHistoryEntity.id,
'c_day':
'${(DateUtil.getDateMsByTimeStr(from) / 1000).floor()}',
};
bool sucess = await customerProvider
.setGuestInfo(context, params,
showLoading: true);
if (sucess) {
Utils.showToast('保存成功');
}
}
// showDateSelWidget = false;
},
yearBegin: 1925,
minValue: DateTime(1925),
dateTime: birthday == ''
? DateTime.now()
: DateUtil.getDateTime(birthday),
pickerDateTimeType: PickerDateTimeType.kYMD,
onCancel: () {
// showDateSelWidget = false;
});
},
),
],
),
),
VEmptyView(20),
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(30)),
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_picker/Picker.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/customer_by_seller_model.dart';
... ... @@ -35,6 +37,9 @@ class CustomerDetailPage extends StatefulWidget {
class _CustomerDetailPageState extends State<CustomerDetailPage> {
ScrollController controller = ScrollController();
CustomerProvider customerProvider;
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
String birthday = '';
@override
void initState() {
... ... @@ -60,6 +65,9 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
'phone': widget.userHistoryEntity.phone
};
await customerProvider.getGuestInfo(context, params);
birthday = customerProvider.guestInfoSunModel.guest.cdaySelfStr;
setState(() {});
// await customerProvider.searchData(customerProvider.controller.text);
}
... ... @@ -205,7 +213,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
)),
],
),
customerProvider.guestInfoSunModel.guest.label != null&& customerProvider.guestInfoSunModel.guest.label != ''
customerProvider.guestInfoSunModel.guest.label != null &&
customerProvider.guestInfoSunModel.guest.label != ''
? Container(
padding: EdgeInsets.only(top: ScreenUtil().setWidth(10)),
constraints:
... ... @@ -489,15 +498,19 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
crossAxisAlignment: WrapCrossAlignment.center,
children: [
Text(
customerProvider.guestInfoSunModel.last?.ddate == null ? '': Utils.formatFromMill(
customerProvider.guestInfoSunModel.last?.ddate ??'',context),
customerProvider.guestInfoSunModel.last?.ddate == null
? ''
: Utils.formatFromMill(
customerProvider.guestInfoSunModel.last?.ddate ??
'',context),
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_E34D59),
),
Text(
customerProvider.guestInfoSunModel.last?.ddateSoltStr??'',
customerProvider.guestInfoSunModel.last?.ddateSoltStr ??
'',
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_438E93),
... ... @@ -509,7 +522,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
color: MyColours.color_515151),
),
Text(
customerProvider.guestInfoSunModel.last.tableinfoName??'',
customerProvider.guestInfoSunModel.last.tableinfoName ??
'',
style: TextStyle(
fontSize: ScreenUtil().setSp(20),
color: MyColours.color_438E93),
... ... @@ -639,8 +653,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
isBold: true,
height: w(22),
onPressed: () {
NavigatorUtil.goWineDetailPage(context,
customerProvider.guestInfoSunModel.store.id,
NavigatorUtil.goWineDetailPage(
context, customerProvider.guestInfoSunModel.store.id,
onlyShow: true);
},
)
... ... @@ -700,7 +714,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
fontSize: ScreenUtil().setSp(20)))));
}
if (customerProvider.guestInfoSunModel.guest.label != null&& customerProvider.guestInfoSunModel.guest.label != '') {
if (customerProvider.guestInfoSunModel.guest.label != null &&
customerProvider.guestInfoSunModel.guest.label != '') {
List<String> labels =
customerProvider.guestInfoSunModel.guest.label.split(',');
labels.forEach((element) {
... ... @@ -772,6 +787,7 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
key: scaffoldKey,
backgroundColor: Color.fromRGBO(246, 248, 250, 1),
appBar: SystemAppBar(
S.of(context).customer_details,
... ... @@ -959,6 +975,78 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
'${customerProvider.guestInfoSunModel.guest.serve == null ? '' : customerProvider.guestInfoSunModel.guest.serve}'),
VEmptyView(20),
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(30)),
color: MyColours.color_ffffff,
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'生日',
style: TextStyle(
fontSize: ScreenUtil().setSp(36),
color: MyColours.color_333333),
),
Spacer(),
Text(
birthday,
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
HEmptyView(20),
RoundButton(
text: '编辑',
radius: ScreenUtil().setWidth(20),
width: ScreenUtil().setWidth(90),
height: ScreenUtil().setWidth(50),
fontSize: 26,
isBold: false,
onPressed: () {
DialogUtil.showPickerDateTime24(
context,
scaffoldKey,
(value) async {
// {'text': picker.adapter.text, 'select': selecteds}
if (value != null) {
setState(() {
print(value);
birthday = DateUtil.formatDateStr(value,
format: DateFormats.y_mo_d);
});
// 请求接口,设置生日
String from = birthday + ' 00:00:00';
Map<String, String> params = {
'id': widget.userHistoryEntity.gid,
'c_day':
'${(DateUtil.getDateMsByTimeStr(from) / 1000).floor()}',
};
bool sucess = await customerProvider
.setGuestInfo(context, params,
showLoading: true);
if (sucess) {
Utils.showToast('保存成功');
}
}
// showDateSelWidget = false;
},
yearBegin: 1925,
minValue: DateTime(1925),
dateTime: birthday == ''
? DateTime.now()
: DateUtil.getDateTime(birthday),
pickerDateTimeType: PickerDateTimeType.kYMD,
onCancel: () {
// showDateSelWidget = false;
});
},
),
],
),
),
VEmptyView(20),
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(30)),
... ...
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:provider/provider.dart';
import '../../../constant/state.dart';
import '../../../provider/customer_provider.dart';
import '../../../provider/marketing_center_provider.dart';
import '../../../provider/user_model.dart';
import '../../../res/colors.dart';
import '../../../route/navigator_util.dart';
import '../../../utils/screen_util.dart';
import '../../../utils/utils.dart';
import '../../../widgets/MyDivider.dart';
import '../../../widgets/h_empty_view.dart';
import '../../../widgets/page_exception.dart';
import '../../../widgets/round_button.dart';
import '../../../widgets/v_empty_view.dart';
/**
*
客户生日提醒及营销
*/
class BirthdaySettingPage extends StatefulWidget {
const BirthdaySettingPage({Key key}) : super(key: key);
@override
_BirthdaySettingPageState createState() => _BirthdaySettingPageState();
}
class _BirthdaySettingPageState extends State<BirthdaySettingPage> {
CustomerProvider customerProvider;
TextEditingController pushBirthdayDayC = TextEditingController();
TextEditingController pushMemorialDayC = TextEditingController();
bool isPushBAhead = false;
bool isSmsBAhead = false;
bool isSmsBNow = false;
bool isPushMemorial = false;
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_sellerGuestGet();
});
}
///获取客情配置
_sellerGuestGet() async {
bool success = await customerProvider.getSellerGuest(context);
if (success) {
//有数据,默认数据
isPushBAhead = customerProvider.sellerGuestData.birthdayAdvNotice == '1'
? true
: false;
isSmsBAhead = customerProvider.sellerGuestData.birthdayAdvNoticeSms == '1'
? true
: false;
isSmsBNow =
customerProvider.sellerGuestData.birthdayNotice == '1' ? true : false;
isPushMemorial =
customerProvider.sellerGuestData.commemorationNotice == '1'
? true
: false;
pushBirthdayDayC.text =
customerProvider.sellerGuestData.birthdayNoticeDay ?? '';
pushMemorialDayC.text =
customerProvider.sellerGuestData.commemorationDay ?? '';
customerProvider.notifyListeners();
}
}
///修改客情配置
Future<bool> _sellerGuestSet() async {
Map<String, String> params = {
"sellerid": Provider.of<UserModel>(context, listen: false).user.sellerid,
'birthday_adv_notice': isPushBAhead ? "1" : "0",
'birthday_adv_notice_sms': isSmsBAhead ? '1' : '0',
'birthday_notice': isSmsBNow ? '1' : '0',
'commemoration_notice': isPushMemorial ? '1' : '0',
};
if (pushBirthdayDayC.text.trim() != '') {
params['birthday_notice_day'] = pushBirthdayDayC.text;
}
if (pushMemorialDayC.text.trim() != '') {
params['commemoration_day'] = pushMemorialDayC.text;
}
bool success = await customerProvider.setSellerGuest(context, params,
showLoading: true);
if (success) {
Utils.showToast('保存成功');
return true;
} else {
return false;
}
}
Widget _item(String title, {GestureTapCallback onTap}) {
return InkWell(
onTap: onTap,
child: Container(
// decoration: BoxDecoration(
// border: Border(
// bottom: BorderSide(
// color: MyColours.color_E7E7E7, width: w(0.5)))),
// margin: EdgeInsets.only(
// right: w(12), left: w(16), bottom: w(0), top: w(14)),
padding: EdgeInsets.only(
left: w(16), top: w(14), bottom: w(3), right: w(12)),
child: Row(
children: [
Text(
title,
style: TextStyle(
color: MyColours.color_515151, fontSize: font(14)),
),
Spacer(),
Container(
padding:
EdgeInsets.symmetric(horizontal: w(7), vertical: w(4)),
child: Image.asset(
"assets/arrow_right_new.png",
width: w(9),
height: w(16),
),
)
],
)));
}
Widget _itemSmsWidget(bool isSelect, String title,
{GestureTapCallback onTap, int fontSize = 14, int left = 16}) {
return Column(
children: [
InkWell(
onTap: onTap,
child: Padding(
padding: EdgeInsets.only(
left: w(left), top: w(14), bottom: w(3), right: w(12)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: TextStyle(
color: MyColours.color_515151,
fontSize: font(fontSize)),
),
Spacer(),
Container(
margin: EdgeInsets.symmetric(
horizontal: w(7), vertical: w(4)),
child: Image.asset(
Utils.getImgPath(isSelect ? 'swich_on' : 'swich_off'),
width: w(44),
),
)
// RoundButton(
// text: '预览',
// gradientStart: MyColours.color_ffffff,
// gradientEnd: MyColours.color_ffffff,
// borderColor: MyColours.color_438E93,
// textColor: MyColours.color_438E93,
// radius: ScreenUtil().setWidth(22),
// fontSize: 24,
// width: w(72),
// height: ScreenUtil().setWidth(44),
// isBold: true,
// onPressed: () {
// NavigatorUtil.goMarkingPreviewPage(context);
// },
// ),
]))),
Padding(
padding: EdgeInsets.only(left: w(left)),
child: MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7)),
],
);
}
Widget _title(String title) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: w(8)),
child: Text(
title,
style: TextStyle(color: MyColours.color_515151, fontSize: font(16)),
),
),
MyDivider(double.infinity, w(0.5), color: MyColours.color_E7E7E7),
],
);
}
///输入框
Widget _textfield(
String title,
String hintText,
TextEditingController controller,
) {
return Container(
margin: EdgeInsets.only(right: w(12)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: Text(
title,
style: TextStyle(
color: MyColours.color_515151,
fontSize: ScreenUtil().setSp(32)),
),
),
HEmptyView(80),
Expanded(
// width: ScreenUtil().setWidth(231 * 2),
child: TextField(
controller: controller,
textAlign: TextAlign.right,
textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
// inputFormatters: title == '券名称'
// ? [LengthLimitingTextInputFormatter(15)]
// : [],
style: TextStyle(
color: MyColours.color_515151,
fontSize: ScreenUtil().setSp(32),
),
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly
],
// focusNode: focusNode,
decoration: InputDecoration(
isCollapsed: true,
border: OutlineInputBorder(borderSide: BorderSide.none),
hintText: hintText,
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(32),
),
enabledBorder: new UnderlineInputBorder(
borderSide: BorderSide.none,
),
focusedBorder: new UnderlineInputBorder(
borderSide: BorderSide.none,
),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
),
),
Text(
'天',
style: TextStyle(color: MyColours.color_515151, fontSize: font(16)),
),
// HEmptyView(32)
],
),
);
}
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_ffffff,
appBar: SystemAppBar('客户生日提醒及营销'),
body: Consumer<CustomerProvider>(builder: (context1, model, _) {
if (model.pageStateBirthdaySetting != PageState.Success) {
return ExceptionPage(
pageState: model.pageStateBirthdaySetting,
callback: () async {
_sellerGuestGet();
},
emptyMsg: "暂时没有客户生日提醒及营销哦",
emptyImg: "empty_search",
showMsg: "加载中,请稍后...",
);
} else {
return Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.only(left: w(16)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
VEmptyView(24),
_textfield('客户生日提前提醒日期', '请输入', pushBirthdayDayC),
VEmptyView(24),
MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7),
_itemSmsWidget(isPushBAhead, '客户生日到达前发送提醒消息',
onTap: () {
setState(() {
isPushBAhead = !isPushBAhead;
});
}),
_itemSmsWidget(isSmsBAhead, '客户生日到达前自动给客户发送短信',
onTap: () {
setState(() {
isSmsBAhead = !isSmsBAhead;
});
}),
VEmptyView(16),
_item('客户本人生日通知短信设置', onTap: () {
NavigatorUtil.goBirthdaySmsModuleSettingPage(
context, '1');
}),
VEmptyView(16),
Padding(
padding: EdgeInsets.only(left: w(16)),
child: MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7)),
VEmptyView(16),
_itemSmsWidget(isSmsBNow, '客户生日当天发送短信',
fontSize: 16, left: 0, onTap: () {
setState(() {
isSmsBNow = !isSmsBNow;
});
}),
VEmptyView(16),
_item('客户本人生日当天通知短信设置', onTap: () {
NavigatorUtil.goBirthdaySmsModuleSettingPage(
context, '2');
}),
VEmptyView(16),
Padding(
padding: EdgeInsets.only(left: w(16)),
child: MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7)),
VEmptyView(48),
_textfield('客户纪念日提前提醒日期', '请输入', pushMemorialDayC),
VEmptyView(24),
MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7),
VEmptyView(16),
_itemSmsWidget(isPushMemorial, '客户生日到达前发送提醒消息',
onTap: () {
setState(() {
isPushMemorial = !isPushMemorial;
});
}),
VEmptyView(16),
],
)),
)),
Container(
color: MyColours.color_ffffff,
padding: EdgeInsets.only(
left: w(23), right: w(23), top: w(12), bottom: w(25)),
child: Row(
children: [
// RoundButton(
// text: '图文预览',
// width: w(100),
// gradientStart: MyColours.color_ffffff,
// gradientEnd: MyColours.color_ffffff,
// borderColor: MyColours.color_438E93,
// radius: r(5),
// fontSize: 32,
// height: w(40),
// textColor: MyColours.color_438E93,
// isBold: true,
// onPressed: () async {
// // NavigatorUtil.goMarkingPreviewPage(context);
// if (previewUrl == '') {
// Utils.showToast('暂时没有可预览的图文信息');
// return;
// }
// //
// _showPhotoView(context, 0, [previewUrl]);
// }),
// HEmptyView(30),
Expanded(
child: RoundButton(
text: '保存',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: r(5),
fontSize: 32,
height: w(40),
isBold: true,
onPressed: () async {
//调用接口
// _setData();
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
_sellerGuestSet();
}))
],
))
],
);
}
}));
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
import '../../../constant/state.dart';
import '../../../models/sai_you_yun_birthday_temp.dart';
import '../../../models/sai_you_yun_change_model.dart';
import '../../../models/sai_you_yun_model.dart';
import '../../../provider/customer_provider.dart';
import '../../../provider/marketing_center_provider.dart';
import '../../../route/navigator_util.dart';
import '../../../utils/event_bus.dart';
import '../../../utils/screen_util.dart';
import '../../../widgets/page_exception.dart';
import '../../../widgets/round_button.dart';
/**
* 生日短信模版配置页面
*/
class BirthdaySmsModuleSettingPage extends StatefulWidget {
final String type;
BirthdaySmsModuleSettingPage({Key key, this.type}) : super(key: key);
@override
_BirthdaySmsModuleSettingPageState createState() =>
_BirthdaySmsModuleSettingPageState();
}
class _BirthdaySmsModuleSettingPageState
extends State<BirthdaySmsModuleSettingPage> {
String contentChangeStart = '';
TextEditingController controller = TextEditingController();
CustomerProvider customerProvider;
int _cursorPosition = 0;
List<String> couponList = [];
bool isUse = false;
String youhui = '选择优惠券';
int couponSelectIndex;
String selectCode = '';
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
getSaiYouYunBirthdayTemp();
_couponNetworkData(isShowLoading: false);
});
}
getSaiYouYunBirthdayTemp() async {
await customerProvider.getSaiYouYunBirthdayTemp(
context,
{
'sid': Provider.of<UserModel>(context, listen: false).user.sellerid,
'type': widget.type
},
isShowLoading: false);
if (customerProvider.saiYouYunBirData != null &&
customerProvider.saiYouYunBirData.length > 0) {
customerProvider.saiYouYunBirData.forEach((element) {
if (element.bestwish != null) {
selectCode = element.templateCode;
contentChangeStart = element.templateParam;
controller.text = element.bestwish;
}
});
if (selectCode == '') {
selectCode = customerProvider.saiYouYunBirData[0].templateCode;
contentChangeStart = customerProvider.saiYouYunBirData[0].templateParam;
}
setState(() {});
}
}
setSaiYouYunBirthday() async {
Map<String, String> pramas = {
'sid': Provider.of<UserModel>(context, listen: false).user.sellerid,
'sms_code': selectCode,
'type': widget.type,
'content': controller.text
};
bool success = await customerProvider.setSaiYouYunBirthday(context, pramas);
if (success) {
Utils.showToast('保存成功');
Navigator.pop(context);
}
}
///消费券
_couponNetworkData({bool isShowLoading = true}) async {
//couponSelectIndex = 0;
Map<String, String> params = {
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
'status': '1'
};
await customerProvider.getCustomerSelectActivityNew(context, params,
isShowLoading: isShowLoading);
//此人已经新建好券
if (customerProvider.couponListSelect.length > 0) {
// couponProvider.initCouponSelect(context);
couponList = [];
for (int i = 0; i < customerProvider.couponListSelect.length; i++) {
couponList.add(customerProvider.couponListSelect[i].aname);
}
customerProvider.notifyListeners();
} else {
//没有新建的优惠券
}
}
_insertUrllink(String link) {
// *************开始直接插入会报错***********还没有改
var cursorPos = controller.selection.base.offset; //获取到光标的在字符串的位置
if (cursorPos < 0) {
controller.text += link;
} else {
String textAfterCursor =
controller.text.substring(cursorPos); //把字符串从光标的位置截取,光标后面的
String textBeforeCursor =
controller.text.substring(0, cursorPos); //光标前面的字符串
controller.text =
textBeforeCursor + link + textAfterCursor; //把想要的插入的内容拼接在光标位置处
controller.selection =
TextSelection.collapsed(offset: controller.text.length);
}
}
List<Widget> templateChangesWidgets(
String title, List<SaiYouYunBirthdaySunModel> temData) {
List<Widget> data = [];
for (var i = 0; i < temData.length; i++) {
data.add(btnItem(temData[i].templateCode, onTap: () {
selectCode = temData[i].templateCode;
controller.text = temData[i].bestwish ?? '';
contentChangeStart = temData[i].templateParam;
setState(() {});
}));
}
return data;
}
Widget btnItem(String title, {GestureTapCallback onTap}) {
return InkWell(
onTap: onTap,
child: Container(
padding: EdgeInsets.all(w(3)),
decoration: BoxDecoration(
color: selectCode == title
? MyColours.color_438E93
: MyColours.color_ffffff,
borderRadius: BorderRadius.circular(r(5)),
border: Border.all(width: w(1), color: MyColours.color_438E93)),
child: Text(title,
style: TextStyle(
color: selectCode == title
? MyColours.color_ffffff
: MyColours.color_438E93,
fontSize: font(12),
fontWeight: FontWeight.bold)),
),
);
}
Widget _templeteWidget(
String title,
) {
return Container(
margin: EdgeInsets.symmetric(horizontal: w(16), vertical: w(5)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(fontSize: font(16), color: MyColours.color_515151),
),
HEmptyView(34),
Expanded(
child: Wrap(
spacing: w(5),
runSpacing: w(5),
children: templateChangesWidgets(
title, customerProvider.saiYouYunBirData),
))
],
),
);
}
_buttonChoose(String title, ClickCallback callback) {
return InkWell(
onTap: () {
callback(title);
},
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(20),
vertical: ScreenUtil().setWidth(10)),
// height: ScreenUtil().setWidth(50),
// decoration: BoxDecoration(
// // border: Border.all(
// // width: ScreenUtil().setWidth(2),
// // color: MyColours.color_199095),
// borderRadius: BorderRadius.circular(ScreenUtil().setWidth(10))),
child: Row(
children: [
Expanded(
child: Text(
title,
textAlign: TextAlign.right,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: title == '选择优惠券'
? MyColours.color_999999
: MyColours.color_438E93,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setWidth(30)),
)),
HEmptyView(20),
Image.asset(
// Utils.getImgPath(!customerMakingProvider.isUse
// ? 'c_arrow_down_unsel'
// : 'c_arrow_down'),
Utils.getImgPath('down_c'),
width: ScreenUtil().setWidth(44),
// height: ScreenUtil().setWidth(10),
)
],
)));
}
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_ffffff,
appBar:
SystemAppBar(widget.type == '1' ? '客户生日提前通知短信设置' : '客户生日当天通知短信设置'),
body: Consumer<CustomerProvider>(builder: (context1, model, _) {
if (model.pageStateBirthday != PageState.Success) {
return ExceptionPage(
pageState: model.pageStateBirthday,
callback: () async {
getSaiYouYunBirthdayTemp();
_couponNetworkData(isShowLoading: false);
},
emptyMsg: "暂时没有客户生日提前通知短信设置哦",
emptyImg: "empty_search",
showMsg: "加载中,请稍后...",
);
} else {
return Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_templeteWidget('模版'),
VEmptyView(10),
Container(
width: double.infinity,
padding: EdgeInsets.all(w(10)),
margin: EdgeInsets.symmetric(horizontal: w(16)),
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_DBDBDB, width: w(1)),
borderRadius: BorderRadius.circular(r(8))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
contentChangeStart,
style: TextStyle(
height: 1.5,
color: MyColours.color_66000000,
fontSize: font(14)),
),
TextField(
enabled: true,
controller: controller,
// textAlign: TextAlign.right,
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 10,
// inputFormatters: title == '金额'
// ? [
// FilteringTextInputFormatter(RegExp("[0-9.]"),
// allow: true),
// MyNumberTextInputFormatter(digit: 2),
// ]
// : [],
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_515151),
// focusNode: focusNode,
decoration: InputDecoration(
border: OutlineInputBorder(
borderSide: BorderSide.none),
hintText: true
? '点击这里编辑您的短信内容。上面的文字时固定不可编辑的。'
: '请选择模版',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
contentPadding: EdgeInsets.zero,
),
onChanged: (value) {
//添加的代码:光标一直在文本框后面
// controller.value = TextEditingValue(
// text: controller.text,
// selection:
// TextSelection.fromPosition(TextPosition(
// affinity: TextAffinity.downstream,
// offset: controller.text.length,
// )));
// setState(() {
// _cursorPosition = controller.selection.baseOffset;
// });
},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
// keyboardType: inputType,
)
],
),
),
VEmptyView(36),
InkWell(
onTap: () {
isUse = !isUse;
setState(() {});
},
child: Padding(
padding: EdgeInsets.symmetric(horizontal: w(16)),
child: Row(children: [
// Image.asset(
// Utils.getImgPath(
// isUse ? 'f_select' : 'f_select_not'),
// width: ScreenUtil().setWidth(44)),
// HEmptyView(15),
Text(
'在当前位置插入优惠',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
fontWeight: FontWeight.bold,
color: MyColours.color_515151),
),
]))),
VEmptyView(26),
Padding(
padding: EdgeInsets.symmetric(horizontal: w(16)),
child: Row(children: [
Expanded(
child: Container(
height: ScreenUtil().setWidth(70),
// width: ScreenUtil().setWidth(130),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10)),
color: MyColours.color_DBDBDB),
child: _buttonChoose(youhui, (value) {
FocusScope.of(context)
.requestFocus(FocusNode()); //隐藏键盘
if (couponList == null ||
couponList.length == 0) {
Utils.showToast('暂无优惠券,请创建新优惠');
return;
}
DialogUtil.showSelectCusmanDialog(
context, couponList,
(value) async {
if (value != null) {
if (customerProvider
.couponListSelect[value.first]
.urllink ==
null) {
//创建链接
//创建券的二维码
Map<String, String> param = {
"sid": Provider.of<UserModel>(
context,
listen: false)
.user
.sellerid,
"id": customerProvider
.couponListSelect[value.first]
.id,
};
dynamic object =
await customerProvider
.createActivityUrlLink(
context, param);
if (object is bool) {
//
} else {
//成功
_insertUrllink(object);
}
} else {
// 直接使用
setState(() {
couponSelectIndex = value.first;
youhui =
couponList[couponSelectIndex];
});
_insertUrllink(customerProvider
.couponListSelect[value.first]
.urllink);
}
}
},
selecteds:
couponSelectIndex == null
? []
: [couponSelectIndex])
.then((value) {});
}))),
HEmptyView(30),
InkWell(
onTap: () async {
// NavigatorUtil.goMarketingRecordsDetailPage(context);
bool needRefresh =
await NavigatorUtil.goCouponEditPage(
context);
print(needRefresh);
if (needRefresh != null && needRefresh) {
//刷新页面数据
// _controller.callRefresh();
_couponNetworkData();
}
},
child: Text('创建新优惠',
style: TextStyle(
decoration: TextDecoration.underline,
color: MyColours.color_438E93,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setSp(28)))),
])),
],
),
)),
Container(
height: ScreenUtil().setWidth(91 * 2),
width: double.infinity,
padding: EdgeInsets.only(
top: ScreenUtil().setWidth(16 * 2),
bottom: ScreenUtil().setWidth(35 * 2),
left: ScreenUtil().setWidth(23 * 2),
right: ScreenUtil().setWidth(23 * 2),
),
decoration: BoxDecoration(
color: MyColours.color_ffffff,
boxShadow: [
BoxShadow(
spreadRadius: ScreenUtil().setWidth(2),
color: Color.fromRGBO(0, 0, 0, 0.1),
offset: Offset(0, ScreenUtil().setWidth(-2)),
blurRadius: ScreenUtil().setWidth(8))
],
borderRadius: BorderRadius.all(
Radius.circular(ScreenUtil().setWidth(16)),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// RoundButton(
// text: '预览效果',
// width: w(100),
// height: ScreenUtil().setWidth(80),
// radius: ScreenUtil().setWidth(14),
// gradientStart: MyColours.color_ffffff,
// gradientEnd: MyColours.color_ffffff,
// borderColor: MyColours.color_438E93,
// textColor: MyColours.color_438E93,
// isBold: true,
// fontSize: 32,
// onPressed: () {
// DialogUtil.cupertinoAlertDialog(context,
// textAlign: TextAlign.left,
// showlTitle: false,
// content: canChange
// ? contentChangeStart + controller.text
// : controller.text);
// },
// ),
// HEmptyView(30),
Expanded(
child: RoundButton(
text: '保存',
height: ScreenUtil().setWidth(80),
radius: ScreenUtil().setWidth(14),
isBold: true,
fontSize: 32,
onPressed: () async {
if (selectCode == '') {
Utils.showToast('请选择模版类型');
return;
}
if (controller.text.trim().length == 0) {
Utils.showToast('请输入内容后保存');
return;
}
setSaiYouYunBirthday();
// }
// print('fffff');
},
),
)
],
)),
],
);
}
}));
}
}
... ...
... ... @@ -225,7 +225,7 @@ class _ChefIntroducePageState extends State<ChefIntroducePage> {
data.add(additionModel);
}
if (marketingCenterProvider.markDataModel.chef.image != null ) {
if (marketingCenterProvider.markDataModel.chef.image != null &&marketingCenterProvider.markDataModel.chef.image!='') {
//设置过图片
String imageUrl =
... ...
... ... @@ -36,16 +36,12 @@ class _MarketingCenterHomePageState extends State<MarketingCenterHomePage> {
// bool selectShowPrice = true; //分享排菜单给客户时展示菜品价格
CollectStoreProvider collectStoreProvider;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
getSellerVersion();
});
}
... ... @@ -152,7 +148,7 @@ class _MarketingCenterHomePageState extends State<MarketingCenterHomePage> {
@override
void dispose() {
EventBus().emit('changeStatusColor');
super.dispose();
}
... ... @@ -381,6 +377,41 @@ class _MarketingCenterHomePageState extends State<MarketingCenterHomePage> {
VEmptyView(24),
InkWell(
onTap: () {
NavigatorUtil.goBirthdaySettingPage(context);
},
child: Padding(
padding: EdgeInsets.only(
left: w(16),
top: w(12),
bottom: w(12),
right: w(12)),
child: Row(
children: [
Text(
'客户纪念日提醒及营销',
style: TextStyle(
color: MyColours.color_515151,
fontSize: ScreenUtil().setWidth(32)),
),
Spacer(),
Container(
padding: EdgeInsets.symmetric(
horizontal: w(7), vertical: w(4)),
child: Image.asset(
"assets/arrow_right_new.png",
width: ScreenUtil().setWidth(18),
height: ScreenUtil().setWidth(32),
),
)
],
))),
Padding(
padding: EdgeInsets.only(left: w(16)),
child: MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7)),
VEmptyView(24),
InkWell(
onTap: () {
NavigatorUtil.goPaymentSettingPage(context);
},
child: Padding(
... ... @@ -409,7 +440,7 @@ class _MarketingCenterHomePageState extends State<MarketingCenterHomePage> {
)
],
))),
Padding(
Padding(
padding: EdgeInsets.only(left: w(16)),
child: MyDivider(double.infinity, w(0.5),
color: MyColours.color_E7E7E7)),
... ...
... ... @@ -2149,38 +2149,38 @@ class _StoreBaseInfoPageState extends State<StoreBaseInfoPage> {
],
)),
VEmptyView(34),
InkWell(
onTap: () {
NavigatorUtil.goBookTimeSettingListPage(
context);
},
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(24)),
child: Container(
height: ScreenUtil().setWidth(40),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(S.of(context).multi_slot_reservation_setup_for_specific_dates,
style: TextStyle(
color: MyColours.color_999999,
fontSize:
ScreenUtil().setSp(28),
)),
Spacer(),
Image.asset(
Utils.getImgPath('arrow_right_new'),
width: ScreenUtil().setWidth(16),
height: ScreenUtil().setWidth(28),
)
],
),
))),
VEmptyView(96),
// InkWell(
// onTap: () {
// NavigatorUtil.goBookTimeSettingListPage(
// context);
// },
// child: Padding(
// padding: EdgeInsets.symmetric(
// horizontal: ScreenUtil().setWidth(24)),
// child: Container(
// height: ScreenUtil().setWidth(40),
// child: Row(
// crossAxisAlignment:
// CrossAxisAlignment.center,
// mainAxisAlignment:
// MainAxisAlignment.spaceBetween,
// children: [
// Text(S.of(context).multi_slot_reservation_setup_for_specific_dates,
// style: TextStyle(
// color: MyColours.color_999999,
// fontSize:
// ScreenUtil().setSp(28),
// )),
// Spacer(),
// Image.asset(
// Utils.getImgPath('arrow_right_new'),
// width: ScreenUtil().setWidth(16),
// height: ScreenUtil().setWidth(28),
// )
// ],
// ),
// ))),
// VEmptyView(96),
Text('${S.of(context).order_taking_time}',
style: TextStyle(
fontWeight: FontWeight.bold,
... ...
... ... @@ -3525,7 +3525,7 @@ class TableManagerPageState extends State<TableManagerPage> {
}
*/
Guest guest = Guest(null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null);
null, null, null, null, null, null, null, null, null,null);
// if (widget.guest == null) {
guest.phone =
... ...
... ... @@ -3173,7 +3173,7 @@ class TableManagerPageSimState extends State<TableManagerPageSim> {
}
*/
Guest guest = Guest(null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null);
null, null, null, null, null, null, null, null, null,null);
// if (widget.guest == null) {
guest.phone =
... ...
... ... @@ -35,7 +35,9 @@ import '../models/get_export_info_model.dart';
import '../models/get_report_field_model.dart';
import '../models/marketing_sms_template_model.dart';
import '../models/month_statics_model.dart';
import '../models/sai_you_yun_birthday_temp.dart';
import '../models/seller_counts_list.dart';
import '../models/seller_guest_model.dart';
import '../pages/my/customer_type/store_customer/bar_chart_page.dart';
import '../res/colors.dart';
... ... @@ -122,11 +124,12 @@ class CustomerProvider extends ChangeNotifier {
PageState pageStateMonth = PageState.Loading;
PageState pageStateDay = PageState.Loading;
PageState pageStateBirthday = PageState.Loading;
bool isrepair = false;
bool isselfphone = false;
bool ispcphone = true;
bool ispcname = true;
bool ispcname = true;
bool isAddOver = true;
bool isSetOver = true;
bool isReserveOver = true;
... ... @@ -135,14 +138,16 @@ class CustomerProvider extends ChangeNotifier {
bool cancelOrderdayManager = true;
bool cancelOrderdayOther = true;
List<MarketingSmsTemplateSunModel> marketingSmsData = [];
List<GetReportFieldSunModel> reportFieldModelData = []; //导出数据字段
GetExportInfoSunModel exportInfoSunModel; //预订导出数据
SellerGuestSunModel sellerGuestData;
PageState pageStateBirthdaySetting = PageState.Loading;
List<SaiYouYunBirthdaySunModel> saiYouYunBirData = [];
/// 获取全店日订单统计数据
Future<DayStaticsSunModel> getSellerCountsListByDay(
BuildContext context, Map<String, String> params,
... ... @@ -174,6 +179,67 @@ class CustomerProvider extends ChangeNotifier {
return dayStaticsData;
}
///客户生日提醒短信模板
Future<bool> setSaiYouYunBirthday(BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.post, HttpUrl.set_sai_you_yun_birthday,
data: params, showLoading: false)
.catchError((error) {
print(error.toString());
if (error is MyError) {
switch (error.type) {
}
}
return false;
});
if (baseResp.code == Constant.status_success) {
return true;
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
}
return false;
}
/// 获取客户生日提醒短信模板配置内容
getSaiYouYunBirthdayTemp(
BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(
context, Method.post, HttpUrl.get_sai_you_yun_birthday_temp,
data: params, showLoading: isShowLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {
switch (error.type) {
}
}
pageStateBirthday = PageState.ConnectivityError;
notifyListeners();
});
if (baseResp == null) return null;
if (baseResp.code == Constant.status_success) {
saiYouYunBirData = SaiYouYunBirthdayModel.fromJson(baseResp.responseData).data;
pageStateBirthday = PageState.Success;
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
pageStateBirthday = PageState.ConnectivityError;
}
notifyListeners();
return saiYouYunBirData;
}
/// 获取全店全月订单统计数据
Future<MonthStaticsSunModel> getSellerCountsListByMonth(
BuildContext context, Map<String, String> params,
... ... @@ -2095,16 +2161,11 @@ class CustomerProvider extends ChangeNotifier {
notifyListeners();
});
if (baseResp != null && baseResp.code == Constant.status_success) {
// guestReserveSunModel =
// GuestReserveModel.fromJson(baseResp.responseData).data;
if (baseResp.responseData['data'] is Map) {
isrepair = baseResp.responseData['data']['is_additional'] == '1'
? true
: false;
isselfphone = baseResp.responseData['data']['is_enter_self'] == '1'
? true
: false;
sellerGuestData = SellerGuestModel.fromJson(baseResp.responseData).data;
if (sellerGuestData != null) {
isrepair = sellerGuestData.isAdditional == '1' ? true : false;
isselfphone = sellerGuestData.isEnterSelf == '1' ? true : false;
pageStateBirthdaySetting = PageState.Success;
return true;
}
... ...
... ... @@ -33,6 +33,7 @@ class MarketingCenterProvider extends ChangeNotifier {
PageState pageStateBookInfo = PageState.Loading;
PageState pageStateThemeHome = PageState.Loading;
PageState pageStateSetting = PageState.Loading;
PageState pageStateSettingMini = PageState.Loading;
List<RechargeListSunModel> rechargeList = [];
... ...
... ... @@ -2326,4 +2326,28 @@ return _navigateTo(context, "${Routes.book_time_setting_edit_page}?sunModel=${Fl
///设置纪念日营销
static Future<dynamic> goBirthdaySettingPage(
BuildContext context, {
replace = false,
}) {
return _navigateTo(context, "${Routes.birthday_setting_page}",
replace: replace);
}
///生日短信模版
static Future<dynamic> goBirthdaySmsModuleSettingPage(
BuildContext context, String type, {
replace = false,
}) {
return _navigateTo(context, "${Routes.birthday_sms_module_setting_page}?type=$type",
replace: replace);
}
}
... ...
... ... @@ -222,6 +222,8 @@ import '../pages/my/feast_manage/feast_type_page.dart';
import '../pages/my/feast_manage/feast_wine_manage_edit_page.dart';
import '../pages/my/feast_manage/feast_wine_manage_page.dart';
import '../pages/my/input_name_phone_setting_page.dart';
import '../pages/my/marketing_center/birthday_setting_page.dart';
import '../pages/my/marketing_center/birthday_sms_module_setting_page.dart';
import '../pages/my/marketing_center/book_notification/book_info_page.dart';
import '../pages/my/marketing_center/book_notification/chef_introduce_page.dart';
import '../pages/my/marketing_center/book_notification/chef_introduce_page_old.dart';
... ... @@ -3986,4 +3988,33 @@ var parkInfoPageHandle = new Handler(
var birthdaySettingPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
// String idstr = params["idstr"].first;
// NotebookDetail detailEntity = NotebookDetail.fromJson(json
// .decode(FluroConvertUtils.fluroCnParamsDecode(params["detail"].first)));
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: BirthdaySettingPage());
});
var birthdaySmsModuleSettingPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
String type = params["type"].first;
// NotebookDetail detailEntity = NotebookDetail.fromJson(json
// .decode(FluroConvertUtils.fluroCnParamsDecode(params["detail"].first)));
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: BirthdaySmsModuleSettingPage(type:type));
});
... ...
... ... @@ -404,6 +404,13 @@ class Routes {
static String park_info_page =
"/park_info_page"; //停车指引介绍
static String birthday_setting_page =
"/birthday_setting_page"; //客户生日提醒及营销
static String birthday_sms_module_setting_page =
"/birthday_sms_module_setting_page"; //客户生日提前通知短信设置
... ... @@ -764,6 +771,15 @@ router.define(select_table_f_or_reserve, handler: handleSelectTableFOrReserveHan
router.define(book_time_setting_edit_page, handler:bookTimeSettingEditPageHandle);
router.define(park_info_page, handler:parkInfoPageHandle);
router.define(birthday_setting_page, handler:birthdaySettingPageHandle);
router.define(birthday_sms_module_setting_page, handler:birthdaySmsModuleSettingPageHandle);
... ...
... ... @@ -9008,9 +9008,10 @@ class DialogUtil {
daySuffix: "日",
minHour: 00,
maxHour: 23,
yearBegin: DateTime.now().year,
yearEnd: 2030,
minValue: DateTime.now(),
// yearBegin: DateTime.now().year,
// yearEnd: 2030,
minValue: DateTime(1925),
maxValue:DateTime.now(),
value: dateTime),
height: ScreenUtil().setWidth(480),
hideHeader: false,
... ...
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
url: "https://pub.flutter-io.cn"
source: hosted
version: "22.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.7.2"
args:
dependency: transitive
description:
name: args
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.1"
async:
dependency: transitive
description:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
build:
dependency: transitive
description:
name: build
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.3"
build_config:
dependency: transitive
description:
name: build_config
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.7"
build_daemon:
dependency: transitive
description:
name: build_daemon
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.10"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.4"
build_runner:
dependency: "direct dev"
description:
name: build_runner
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.12.2"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.12"
built_collection:
dependency: transitive
description:
name: built_collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.8.0"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.1"
cli_util:
dependency: transitive
description:
name: cli_util
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.5"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.7.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.18.0"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.1"
coverage:
dependency: "direct dev"
description:
name: coverage
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.2"
dart_style:
dependency: transitive
description:
name: dart_style
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
file:
dependency: transitive
description:
name: file
url: "https://pub.flutter-io.cn"
source: hosted
version: "6.1.4"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
glob:
dependency: transitive
description:
name: glob
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
graphs:
dependency: transitive
description:
name: graphs
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
http:
dependency: "direct main"
description:
name: http
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.13.5"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.1"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.2"
io:
dependency: transitive
description:
name: io
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
js:
dependency: transitive
description:
name: js
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.5"
json_annotation:
dependency: "direct main"
description:
name: json_annotation
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.0"
json_serializable:
dependency: "direct dev"
description:
name: json_serializable
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.4"
logging:
dependency: transitive
description:
name: logging
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.11"
meta:
dependency: "direct main"
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.16.0"
mime:
dependency: transitive
description:
name: mime
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
node_preamble:
dependency: transitive
description:
name: node_preamble
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.2"
package_config:
dependency: transitive
description:
name: package_config
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.3"
pedantic:
dependency: "direct dev"
description:
name: pedantic
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.11.1"
pool:
dependency: transitive
description:
name: pool
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.1"
pub_semver:
dependency: transitive
description:
name: pub_semver
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
shelf:
dependency: transitive
description:
name: shelf
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.1"
shelf_packages_handler:
dependency: transitive
description:
name: shelf_packages_handler
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.2"
shelf_static:
dependency: transitive
description:
name: shelf_static
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.2"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
source_gen:
dependency: transitive
description:
name: source_gen
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
source_map_stack_trace:
dependency: transitive
description:
name: source_map_stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
source_maps:
dependency: transitive
description:
name: source_maps
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.10.12"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.11.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.1"
test:
dependency: "direct dev"
description:
name: test
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.18.1"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.5"
test_core:
dependency: transitive
description:
name: test_core
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.4"
timing:
dependency: transitive
description:
name: timing
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.2"
vm_service:
dependency: transitive
description:
name: vm_service
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.5.0"
watcher:
dependency: transitive
description:
name: watcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.4.0"
webkit_inspection_protocol:
dependency: transitive
description:
name: webkit_inspection_protocol
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.1"
sdks:
dart: ">=2.18.0 <3.0.0"
... ...