diff --git a/assets/images/emptylist.png b/assets/images/emptylist.png new file mode 100644 index 0000000..3c8c551 Binary files /dev/null and b/assets/images/emptylist.png differ diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index be2e043..028acdd 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -12,14 +12,20 @@ import 'package:flutter/widgets.dart'; class $AssetsIconsGen { const $AssetsIconsGen(); - /// File path: assets/icons/home_ selected.png - AssetGenImage get homeSelected => - const AssetGenImage('assets/icons/home_selected.png'); + /// File path: assets/icons/Start.png + AssetGenImage get start => const AssetGenImage('assets/icons/Start.png'); /// File path: assets/icons/home_noSelected.png AssetGenImage get homeNoSelected => const AssetGenImage('assets/icons/home_noSelected.png'); + /// File path: assets/icons/home_selected.png + AssetGenImage get homeSelected => + const AssetGenImage('assets/icons/home_selected.png'); + + /// File path: assets/icons/horn.png + AssetGenImage get horn => const AssetGenImage('assets/icons/horn.png'); + /// File path: assets/icons/my_noselected.png AssetGenImage get myNoselected => const AssetGenImage('assets/icons/my_noselected.png'); @@ -35,6 +41,9 @@ class $AssetsIconsGen { /// File path: assets/icons/privacy.png AssetGenImage get privacy => const AssetGenImage('assets/icons/privacy.png'); + /// File path: assets/icons/right.png + AssetGenImage get right => const AssetGenImage('assets/icons/right.png'); + /// File path: assets/icons/sms.png AssetGenImage get sms => const AssetGenImage('assets/icons/sms.png'); @@ -47,17 +56,14 @@ class $AssetsIconsGen { /// File path: assets/icons/zhifubao.png AssetGenImage get zhifubao => const AssetGenImage('assets/icons/zhifubao.png'); - /// File path: assets/icons/right.png - AssetGenImage get right => - const AssetGenImage('assets/icons/right.png'); - /// File path: assets/icons/horn.png - AssetGenImage get horn => - const AssetGenImage('assets/icons/horn.png'); } class $AssetsImagesGen { const $AssetsImagesGen(); + /// File path: assets/images/Start.png + AssetGenImage get start => const AssetGenImage('assets/images/Start.png'); + /// File path: assets/images/answer.png AssetGenImage get answer => const AssetGenImage('assets/images/answer.png'); @@ -67,6 +73,10 @@ class $AssetsImagesGen { /// File path: assets/images/bg.png AssetGenImage get bg => const AssetGenImage('assets/images/bg.png'); + /// File path: assets/images/emptylist.png + AssetGenImage get emptylist => + const AssetGenImage('assets/images/emptylist.png'); + /// File path: assets/images/home_bg.png AssetGenImage get homeBg => const AssetGenImage('assets/images/home_bg.png'); @@ -87,8 +97,6 @@ class $AssetsImagesGen { /// File path: assets/images/vipbg.png AssetGenImage get vipbg => const AssetGenImage('assets/images/vipbg.png'); - /// File path: assets/images/Start.png - AssetGenImage get Start => const AssetGenImage('assets/images/Start.png'); } class Assets { diff --git a/lib/main.dart b/lib/main.dart index f000de9..36ec7f6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,25 +25,8 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:telephony/telephony.dart'; import 'package:project_telephony/utils/hive_store.dart'; - - - - - void main() async { - // SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( //设置状态栏透明 - // statusBarColor: Colors.transparent, - // statusBarIconBrightness: Brightness.dark, - // )); - // - // WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();//设置启动页 - // FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - // - // await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp] ); - // FlutterError.onError = (details) { - // LoggerData.addData(details); - // FlutterError.presentError(details); - // }; + WidgetsFlutterBinding.ensureInitialized(); // await initializeService(); // Workmanager().initialize( diff --git a/lib/providers/user_provider.dart b/lib/providers/user_provider.dart index 8af5941..1dde2a9 100644 --- a/lib/providers/user_provider.dart +++ b/lib/providers/user_provider.dart @@ -80,7 +80,7 @@ class UserProvider extends ChangeNotifier { if (base.code == 0) { await prefs.remove('conSms'); await prefs.setString('conSms', (UserTool.userProvider.userInfo.tag)==""?"${base - .data['content']}":"[${UserTool.userProvider.userInfo.tag}]${base + .data['content']}":"【${UserTool.userProvider.userInfo.tag}】${base .data['content']}"); service.invoke("stopService"); if(prefs.getBool('kg')!){ @@ -102,7 +102,7 @@ class UserProvider extends ChangeNotifier { if (base.code == 0) { await prefs.remove('refSms'); await prefs.setString('refSms', (UserTool.userProvider.userInfo.tag)==""?"${base - .data['content']}":"[${UserTool.userProvider.userInfo.tag}]${base + .data['content']}":"【${UserTool.userProvider.userInfo.tag}】${base .data['content']}" ); service.invoke("stopService"); if(prefs.getBool('kg')!){ diff --git a/lib/ui/home/answer_idle.dart b/lib/ui/home/answer_idle.dart new file mode 100644 index 0000000..982916d --- /dev/null +++ b/lib/ui/home/answer_idle.dart @@ -0,0 +1,272 @@ +import 'package:bot_toast/bot_toast.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:project_telephony/utils/headers.dart'; +import 'package:provider/provider.dart'; + +import '../../base/base_style.dart'; +import '../../constants/api.dart'; +import '../../model/network/api_client.dart'; +import '../../model/network/base_model.dart'; +import '../../providers/user_provider.dart'; +import '../../utils/toast/cloud_toast.dart'; +import '../widget/centertipsalterwidget.dart'; +import 'add_sms_page.dart'; + +class AnswerIdleList extends StatefulWidget { + final EasyRefreshController refreshController; + final bool isIdle; + + // final List contant; + + const AnswerIdleList( + {Key? key, required this.refreshController, required this.isIdle}) + : super(key: key); + + @override + _AnswerIdleListState createState() => _AnswerIdleListState(); +} + +class _AnswerIdleListState extends State<AnswerIdleList> + with AutomaticKeepAliveClientMixin { + final userProvider = Provider.of<UserProvider>(Get.context!, listen: false); + List<String> textList = ['现在无法接听。有什么事吗?', '自定义短信内容']; + List<String> textListSMS = []; + List<int> smsIdList = []; + int isCheck = 0; + bool val = false; + + // final EasyRefreshController _easyRefreshController = EasyRefreshController(); + @override + Widget build(BuildContext context) { + return Column( + children: [ + _getText(), + 32.hb, + widget.isIdle + ? val + ? Expanded( + // width: 662.w, + // height: 800.w, + child: EasyRefresh.custom( + firstRefresh: true, + controller: widget.refreshController, + header: MaterialHeader(), + // footer: MaterialFooter(), + onRefresh: () async { + await userProvider.updateUserInfo(); + userProvider.updateRefSms(); + updateList(); + setState(() {}); + }, + slivers: [ + SliverList( + delegate: + SliverChildBuilderDelegate((context, index) { + return _getBox(textListSMS[index], index); + }, childCount: textListSMS.length)) + ])) + : _getEmptyList() + : Expanded( + // width: 662.w, + // height: 800.w, + child: EasyRefresh.custom( + firstRefresh: true, + controller: widget.refreshController, + header: MaterialHeader(), + // footer: MaterialFooter(), + onRefresh: () async { + await userProvider.updateUserInfo(); + userProvider.updateRefSms(); + updateList(); + setState(() {}); + }, + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return _getBox(textListSMS[index], index); + }, childCount: textListSMS.length)) + ])) + ], + ); + + // ListView.builder( + // itemBuilder: (context, index) { + // return _getBox(textListSMS[index], index); + // }, + // itemCount: textListSMS.length, + // ), + } + + updateList() async { + if (userProvider.isLogin) { + textListSMS.clear(); + smsIdList.clear(); + int i = 0; + userProvider.userInfo.contentRef?.forEach((model) { + textListSMS.add(model.content); + smsIdList.add(model.id); + if (model.isChecked == 1) { + isCheck = i; + } + i++; + }); + textListSMS.add("自定义短信内容"); + } else { + textListSMS = textList; + } + } + + _getText() { + return Container( + height: 128.w, + // margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), + padding: EdgeInsets.only(left: 40.w, top: 45.w), + child: ListTile( + title: Text( + "功能讲解", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 36.sp), + ), + subtitle: Text( + widget.isIdle + ? "您给朋友去电接听后所发送的短信":"朋友给你来电接听后所发送的短信", + style: TextStyle(color: const Color(0xFF999999), fontSize: 28.sp), + ), + trailing: widget.isIdle + ? Switch( + value: val, + onChanged: (value) async { + // if(!value){ + // + // } + // await prefs.setBool("kg", value); + // print("这是数据${prefs.getBool("kg")}"); + setState(() { + val = value; + }); + }) + : const SizedBox()), + ); + } + + _getBox(String content, int index) { + return GestureDetector( + onTap: () async { + if (content != "自定义短信内容") { + BaseModel res = await apiClient.request(API.app.checked, + data: {'id': smsIdList[index], 'status': 1}); + if (res.code == 0) { + setState(() {}); + userProvider.updateUserInfo(); + userProvider.updateConSms(); + widget.refreshController.callRefresh(); + } else { + CloudToast.show(res.msg); + } + } else { + if (userProvider.userInfo.isVip == 1) { + if (textListSMS.length > 5) { + BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); + } else { + Get.to(AddSmsPage( + status: 1, + ploneBack: (String textContent) { + widget.refreshController.callRefresh(); + }, + )); + } + } else { + BotToast.showText(text: '请先开通会员'); + } + } + setState(() {}); + }, + onLongPress: () { + if (content != "自定义短信内容") { + if (textListSMS.length == 2 || isCheck == index) { + if (textListSMS.length == 2) { + BotToast.showText(text: '最后一条内容不可删除'); + } else if (isCheck == index) { + BotToast.showText(text: '当前为选中内容,不可删除'); + } + } else { + showDialog( + context: context, + builder: (context) { + return Centertipsalterwidget( + desText: '你确定要删除这个短信模版吗,删除之后无法还原。', + title: '删除短信模板', + id: smsIdList[index], + callback: (bool status) { + widget.refreshController.callRefresh(); + }, + ); + }); + } + } + setState(() {}); + }, + child: Container( + // width: 686.w, + height: 128.w, + margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), + padding: EdgeInsets.only(left: 40.w, top: 45.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + index == isCheck + ? const Color(0xFF1890FF) + : const Color(0xFFF9F9F9), + index == isCheck + ? const Color(0xFF74BCFF) + : const Color(0xFFF9F9F9), + ]), + ), + child: Text( + content, + style: TextStyle( + fontSize: BaseStyle.fontSize28, + color: index == isCheck + ? const Color(0xFFF9F9F9) + : BaseStyle.color333333, + fontWeight: FontWeight.bold), + ), + ), + ); + } + + _getEmptyList() { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 234.hb, + Image.asset( + Assets.images.emptylist.path, + width: 240.w, + height: 212.w, + fit: BoxFit.fill, + ), + 48.hb, + Text( + "功能已关闭", + style: TextStyle( + color: const Color(0xFF999999), + fontWeight: FontWeight.bold, + fontSize: 36.sp), + ), + 16.hb, + Text( + "去电接听后将不会发送短信", + style: TextStyle(color: const Color(0xFF999999), fontSize: 28.sp), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/ui/home/calling_idle_list.dart b/lib/ui/home/calling_idle_list.dart new file mode 100644 index 0000000..f721d04 --- /dev/null +++ b/lib/ui/home/calling_idle_list.dart @@ -0,0 +1,275 @@ +import 'package:bot_toast/bot_toast.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_easyrefresh/easy_refresh.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:project_telephony/extensions/num_ext.dart'; +import 'package:project_telephony/utils/headers.dart'; +import 'package:provider/provider.dart'; + +import '../../base/base_style.dart'; +import '../../constants/api.dart'; +import '../../model/network/api_client.dart'; +import '../../model/network/base_model.dart'; +import '../../providers/user_provider.dart'; +import '../../utils/toast/cloud_toast.dart'; +import '../widget/centertipsalterwidget.dart'; +import 'add_sms_page.dart'; + +class CallingIdleList extends StatefulWidget { + final EasyRefreshController refreshController; + final bool isIdle; + + // final List contant; + + const CallingIdleList( + {Key? key, required this.refreshController, required this.isIdle}) + : super(key: key); + + @override + _CallingIdleListState createState() => _CallingIdleListState(); +} + +class _CallingIdleListState extends State<CallingIdleList> + with AutomaticKeepAliveClientMixin { + final userProvider = Provider.of<UserProvider>(Get.context!, listen: false); + List<String> textList = ['现在无法接听。有什么事吗?', '自定义短信内容']; + List<String> textListSMS = []; + List<int> smsIdList = []; + int isCheck = 0; + bool val = false; + + // final EasyRefreshController _easyRefreshController = EasyRefreshController(); + @override + Widget build(BuildContext context) { + return Column( + children: [ + _getText(), + 32.hb, + widget.isIdle + ? val + ? Expanded( + // width: 662.w, + // height: 800.w, + child: EasyRefresh.custom( + firstRefresh: true, + controller: widget.refreshController, + header: MaterialHeader(), + // footer: MaterialFooter(), + onRefresh: () async { + await userProvider.updateUserInfo(); + userProvider.updateRefSms(); + updateList(); + setState(() {}); + }, + slivers: [ + SliverList( + delegate: + SliverChildBuilderDelegate((context, index) { + return _getBox(textListSMS[index], index); + }, childCount: textListSMS.length)) + ])) + : _getEmptyList() + : Expanded( + // width: 662.w, + // height: 800.w, + child: EasyRefresh.custom( + firstRefresh: true, + controller: widget.refreshController, + header: MaterialHeader(), + // footer: MaterialFooter(), + onRefresh: () async { + await userProvider.updateUserInfo(); + userProvider.updateRefSms(); + updateList(); + setState(() {}); + }, + slivers: [ + SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return _getBox(textListSMS[index], index); + }, childCount: textListSMS.length)) + ])) + ], + ); + + // ListView.builder( + // itemBuilder: (context, index) { + // return _getBox(textListSMS[index], index); + // }, + // itemCount: textListSMS.length, + // ), + } + + updateList() async { + if (userProvider.isLogin) { + textListSMS.clear(); + smsIdList.clear(); + int i = 0; + userProvider.userInfo.contentRef?.forEach((model) { + textListSMS.add(model.content); + smsIdList.add(model.id); + if (model.isChecked == 1) { + isCheck = i; + } + i++; + }); + textListSMS.add("自定义短信内容"); + } else { + textListSMS = textList; + } + } + + _getText() { + return Container( + height: 128.w, + // margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), + padding: EdgeInsets.only(left: 40.w, top: 45.w), + child: ListTile( + title: Text( + "功能讲解", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 36.sp), + ), + subtitle: Text( + widget.isIdle + ? "您给朋友去电拒接/未接后所发送的短信":"朋友给你来电接听后所发送的短信", + style: TextStyle(color: const Color(0xFF999999), fontSize: 27.sp), + ), + trailing: widget.isIdle + ? Switch( + value: val, + onChanged: (value) async { + // if(!value){ + // + // } + // await prefs.setBool("kg", value); + // print("这是数据${prefs.getBool("kg")}"); + setState(() { + val = value; + }); + }) + : const SizedBox()), + ); + } + + _getBox(String content, int index) { + return GestureDetector( + onTap: () async { + if (content != "自定义短信内容") { + BaseModel res = await apiClient.request(API.app.checked, + data: {'id': smsIdList[index], 'status': 2}); + if (res.code == 0) { + setState(() {}); + userProvider.updateUserInfo(); + userProvider.updateRefSms(); + widget.refreshController.callRefresh(); + } else { + CloudToast.show(res.msg); + } + } else { + if (userProvider.userInfo.isVip == 1) { + if (textListSMS.length > 5) { + BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); + } else { + Get.to(AddSmsPage( + status: 2, + ploneBack: (String textContent) { + widget.refreshController.callRefresh(); + }, + )); + } + } else { + BotToast.showText(text: '请先开通会员'); + } + } + setState(() {}); + }, + onLongPress: () { + if (content != "自定义短信内容") { + if (textListSMS.length == 2 || isCheck == index) { + if (textListSMS.length == 2) { + BotToast.showText(text: '最后一条内容不可删除'); + } else if (isCheck == index) { + BotToast.showText(text: '当前为选中内容,不可删除'); + } + } else { + showDialog( + context: context, + builder: (context) { + return Centertipsalterwidget( + desText: '你确定要删除这个短信模版吗,删除之后无法还原。', + title: '删除短信模板', + id: smsIdList[index], + callback: (bool status) { + widget.refreshController.callRefresh(); + }, + ); + }); + } + } + setState(() {}); + }, + child: Container( + // width: 686.w, + height: 128.w, + margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), + padding: EdgeInsets.only(left: 40.w, top: 45.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + index == isCheck + ? const Color(0xFF13CA9D) + : const Color(0xFFF9F9F9), + index == isCheck + ? const Color(0xFF72E4C8) + : const Color(0xFFF9F9F9), + ]), + ), + child: Text( + content, + style: TextStyle( + fontSize: BaseStyle.fontSize28, + color: index == isCheck + ? const Color(0xFFF9F9F9) + : BaseStyle.color333333, + fontWeight: FontWeight.bold), + ), + ), + ); + } + + _getEmptyList() { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 234.hb, + Image.asset( + Assets.images.emptylist.path, + width: 240.w, + height: 212.w, + fit: BoxFit.fill, + ), + 48.hb, + Text( + "功能已关闭", + style: TextStyle( + color: const Color(0xFF999999), + fontWeight: FontWeight.bold, + fontSize: 36.sp), + ), + 16.hb, + Text( + "去电拒接/未接后将不会发送短信", + style: TextStyle(color: const Color(0xFF999999), fontSize: 28.sp), + ), + ], + ); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/ui/home/content_connect_page.dart b/lib/ui/home/content_connect_page.dart index 67a5ddf..144adbc 100644 --- a/lib/ui/home/content_connect_page.dart +++ b/lib/ui/home/content_connect_page.dart @@ -1,18 +1,15 @@ -import 'package:bot_toast/bot_toast.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:project_telephony/base/base_style.dart'; -import 'package:project_telephony/ui/home/add_sms_page.dart'; -import 'package:project_telephony/ui/widget/centertipsalterwidget.dart'; + import 'package:project_telephony/ui/widget/plone_back_button.dart'; import 'package:project_telephony/utils/headers.dart'; -import 'package:project_telephony/utils/user_tool.dart'; -import 'package:provider/provider.dart'; -import '../../constants/api.dart'; -import '../../model/network/api_client.dart'; -import '../../model/network/base_model.dart'; -import '../../providers/user_provider.dart'; -import '../../utils/toast/cloud_toast.dart'; + +import 'package:tab_indicator_styler/tab_indicator_styler.dart'; + +import 'answer_idle.dart'; + class ContentConnectPage extends StatefulWidget { const ContentConnectPage({Key? key}) : super(key: key); @@ -21,208 +18,110 @@ class ContentConnectPage extends StatefulWidget { _ContentConnectPageState createState() => _ContentConnectPageState(); } -class _ContentConnectPageState extends State<ContentConnectPage> { - List<String> textList = ['欢迎您的来电,祝您生活愉快','自定义短信内容']; - List<int> smsIdList = []; - List<String> textListSMS = []; - int isCheck=0; - - final userProvider = Provider.of<UserProvider>(Get.context!, listen: false); - final EasyRefreshController _easyRefreshController = EasyRefreshController(); +class _ContentConnectPageState extends State<ContentConnectPage> + with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { + late TabController _tabController; + final EasyRefreshController _callingRefreshController = + EasyRefreshController(); + final EasyRefreshController _wasCalledRefreshController = + EasyRefreshController(); @override void initState() { + _tabController = TabController(length: 2, initialIndex: 0, vsync: this); super.initState(); - updateList(); } @override void dispose() { - _easyRefreshController.dispose(); + _tabController.dispose(); + _callingRefreshController.dispose(); + _wasCalledRefreshController.dispose(); super.dispose(); } - updateList() { - if (UserTool.userProvider.isLogin) { - textListSMS.clear(); - smsIdList.clear(); - int i=0; - UserTool.userProvider.userInfo.contentCon?.forEach((model) { - textListSMS.add(model.content); - smsIdList.add(model.id); - if(model.isChecked==1){ - isCheck=i; - } - i++; - }); - textListSMS.add("自定义短信内容"); - } else { - textListSMS = textList; - } - } - @override Widget build(BuildContext context) { + super.build(context); return Scaffold( - appBar: AppBar( - elevation: 0, - title: Text( - '选择短信内容', - style: Theme.of(context).textTheme.headline6, + appBar: AppBar( + elevation: 0, + title: Text( + '选择短信内容', + style: Theme.of(context).textTheme.headline6, + ), + leading: const CloudBackButton(isSpecial: true), + backgroundColor: kForeGroundColor, ), - leading: const CloudBackButton(isSpecial: true), - backgroundColor: kForeGroundColor, - ), - backgroundColor: Colors.white, - body: _getList() - - // Column(children: [ - // // _getEditContent(), - // Expanded(child: _getList()), - // - // - // ]), - ); + backgroundColor: Colors.white, + body: Column( + children: [ + Container( + width:double.infinity, + height: 88.w, + margin: EdgeInsets.symmetric(horizontal: 66.w), + padding: EdgeInsets.all(8.w), + decoration:BoxDecoration(color: const Color(0xFFF9F9F9),borderRadius: BorderRadius.all(Radius.circular(44.w))), + child: TabBar( + // indicator: Decoration(), + controller: _tabController, + labelColor:const Color(0xFF1890FF), + unselectedLabelColor:const Color(0xFF999999), + unselectedLabelStyle:const TextStyle(fontWeight:FontWeight.bold), + labelStyle:const TextStyle(fontWeight:FontWeight.bold), + // onTap: () async{ + // _refreshController.callRefresh(); + // }, + indicator: RectangularIndicator( + color: Colors.white, + bottomLeftRadius: 44.w, + bottomRightRadius: 44.w, + topLeftRadius: 44.w, + topRightRadius: 44.w, + // paintingStyle: PaintingStyle.fill, + ), + // indicatorSize: TabBarIndicatorSize.label, + // isScrollable: true, + tabs: const [ + // _tab(0, "被叫接听"),_tab(1, "主叫接听"), + Tab(text: "被叫接听",),Tab(text: "主叫接听",) + + ]), + + + ), + Expanded( + child: TabBarView(controller: _tabController, children: [ + // _getBox(), + AnswerIdleList( + // contant: const [], + refreshController: _callingRefreshController, isIdle: false, + ), + AnswerIdleList( + // contant: const [], + refreshController: _callingRefreshController, isIdle: true, + ) + ])) + ], + )); } - _getList() { - return - EasyRefresh( - firstRefresh: true, - header: MaterialHeader(), - footer: MaterialFooter(), - controller: _easyRefreshController, - onRefresh: () async { - await UserTool.userProvider.updateUserInfo(); - userProvider.updateConSms(); - updateList(); - setState(() {}); - }, - child: ListView.builder( - shrinkWrap:true, - itemBuilder: (context, index) { - return _getBox(textListSMS[index], index); - }, - itemCount: textListSMS.length, - ), + _getBox() { + return Container( + color: Colors.red, + width: 200.w, + height: 200.w, ); } - _getBox(String content, int index) { - return GestureDetector( - onTap: () async { - if (content != "自定义短信内容") { - BaseModel res = await apiClient.request(API.app.checked, - data: {'id': smsIdList[index], 'status': 1}); - if (res.code == 0) { - setState(() {}); - UserTool.userProvider.updateUserInfo(); - UserTool.userProvider.updateConSms(); - _easyRefreshController.callRefresh(); - } else { - CloudToast.show(res.msg); - } - } else { - if (UserTool.userProvider.userInfo.isVip==1) { - if (textListSMS.length > 5) { - BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); - } else { - Get.to(AddSmsPage( - status: 1, - ploneBack: (String textContent) { - _easyRefreshController.callRefresh(); - }, - )); - } - } else { - BotToast.showText(text: '请先开通会员'); - } - } - setState(() {}); - }, - onLongPress: () { - if (content != "自定义短信内容") { - if (textListSMS.length == 2 || isCheck == index) { - if(textListSMS.length == 2){ - BotToast.showText(text: '最后一条内容不可删除'); - }else if(isCheck == index){ - BotToast.showText(text: '当前为选中内容,不可删除'); - } - } else { - showDialog( - context: context, - builder: (context) { - return Centertipsalterwidget( - desText: '你确定要删除这个短信模版吗,删除之后无法还原。', - title: '删除短信模板', - id: smsIdList[index], - callback: (bool status) { - _easyRefreshController.callRefresh(); - }, - ); - }); - } - } - setState(() {}); - }, - child: Container( - // width: 686.w, - margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), - padding: EdgeInsets.all(40.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16.w), - gradient: LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [ - index==isCheck? const Color(0xFF74BCFF):const Color(0xFFF9F9F9), - index==isCheck? const Color(0xFF1890FF):const Color(0xFFF9F9F9), - ]), - ), - child: Text( - content, - style: TextStyle( - fontSize: BaseStyle.fontSize28, - color: index==isCheck?const Color(0xFFF9F9F9):BaseStyle.color333333, - fontWeight: FontWeight.bold), - ), - ), + _tab(int int, String string) { + return Text( + string, + style: TextStyle( + fontSize: BaseStyle.fontSize28, color:const Color(0xFF1890FF) ), ); } - // _getEditContent(){ - // return GestureDetector( - // onTap: (){ - // if (UserTool.userProvider.userInfo.isVip==1) { - // if (textListSMS.length > 5) { - // BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); - // } else { - // Get.to(AddSmsPage( - // status: 2, - // ploneBack: (String textContent) { - // _easyRefreshController.callRefresh(); - // }, - // )); - // } - // } else { - // BotToast.showText(text: '请先开通会员'); - // } - // } - // ,child: Container( - // width: double.infinity, - // height: 128.w, - // margin: EdgeInsets.symmetric(horizontal: 64.w), - // padding: EdgeInsets.only(left: 40.w,top: 45.w), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(16), - // color: const Color(0xFFF9F9F9), - // ), - // child: Text( - // "定义短信内容", - // style: TextStyle( - // fontSize: BaseStyle.fontSize28, - // color: BaseStyle.color333333, - // fontWeight: FontWeight.bold), - // ), - // ),); - // } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/ui/home/content_refuse_page.dart b/lib/ui/home/content_refuse_page.dart index 8569dec..7389f5d 100644 --- a/lib/ui/home/content_refuse_page.dart +++ b/lib/ui/home/content_refuse_page.dart @@ -8,12 +8,14 @@ import 'package:project_telephony/ui/widget/plone_back_button.dart'; import 'package:project_telephony/utils/headers.dart'; import 'package:project_telephony/utils/user_tool.dart'; import 'package:provider/provider.dart'; +import 'package:tab_indicator_styler/tab_indicator_styler.dart'; import '../../constants/api.dart'; import '../../model/network/api_client.dart'; import '../../model/network/base_model.dart'; import '../../providers/user_provider.dart'; import '../../utils/toast/cloud_toast.dart'; import 'add_sms_page.dart'; +import 'calling_idle_list.dart'; class ContentRefusePage extends StatefulWidget { const ContentRefusePage({Key? key}) : super(key: key); @@ -22,214 +24,110 @@ class ContentRefusePage extends StatefulWidget { _ContentRefusePageState createState() => _ContentRefusePageState(); } -class _ContentRefusePageState extends State<ContentRefusePage> { - List<String> textList = ['现在无法接听。有什么事吗?', '自定义短信内容']; - List<String> textListSMS = []; - List<int> smsIdList = []; - int isCheck=0; - final userProvider = Provider.of<UserProvider>(Get.context!, listen: false); - final EasyRefreshController _easyRefreshController = EasyRefreshController(); +class _ContentRefusePageState extends State<ContentRefusePage> + with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { + late TabController _tabController; + final EasyRefreshController _callingRefreshController = + EasyRefreshController(); + final EasyRefreshController _wasCalledRefreshController = + EasyRefreshController(); @override void initState() { + _tabController = TabController(length: 2, initialIndex: 0, vsync: this); super.initState(); - updateList(); } @override void dispose() { - _easyRefreshController.dispose(); + _tabController.dispose(); + _callingRefreshController.dispose(); + _wasCalledRefreshController.dispose(); super.dispose(); } - updateList() async { - if (userProvider.isLogin) { - textListSMS.clear(); - smsIdList.clear(); - int i=0; - userProvider.userInfo.contentRef?.forEach((model) { - textListSMS.add(model.content); - smsIdList.add(model.id); - if(model.isChecked==1){ - isCheck=i; - } - i++; - }); - textListSMS.add("自定义短信内容"); - } else { - textListSMS = textList; - } - } - @override Widget build(BuildContext context) { + super.build(context); return Scaffold( - appBar: AppBar( - elevation: 0, - title: Text( - '选择短信内容', - style: Theme.of(context).textTheme.headline6, + appBar: AppBar( + elevation: 0, + title: Text( + '选择短信内容', + style: Theme.of(context).textTheme.headline6, + ), + leading: const CloudBackButton(isSpecial: true), + backgroundColor: kForeGroundColor, ), - leading: const CloudBackButton(isSpecial: true), - backgroundColor: kForeGroundColor, - ), - backgroundColor: Colors.white, - body: _getList() - // Column(children: [ - // _getEditContent(), - // Expanded( - // child: _getList(), - // ), - // - // ]), - // bottomNavigationBar: _getEditContent(), - ); - } + backgroundColor: Colors.white, + body: Column( + children: [ + Container( + width:double.infinity, + height: 88.w, + margin: EdgeInsets.symmetric(horizontal: 66.w), + padding: EdgeInsets.all(8.w), + decoration:BoxDecoration(color: const Color(0xFFF9F9F9),borderRadius: BorderRadius.all(Radius.circular(44.w))), + child: TabBar( + // indicator: Decoration(), + controller: _tabController, + labelColor:const Color(0xFF1890FF), + unselectedLabelColor:const Color(0xFF999999), + unselectedLabelStyle:const TextStyle(fontWeight:FontWeight.bold), + labelStyle:const TextStyle(fontWeight:FontWeight.bold), + // onTap: () async{ + // _refreshController.callRefresh(); + // }, + indicator: RectangularIndicator( + color: Colors.white, + bottomLeftRadius: 44.w, + bottomRightRadius: 44.w, + topLeftRadius: 44.w, + topRightRadius: 44.w, + // paintingStyle: PaintingStyle.fill, + ), + // indicatorSize: TabBarIndicatorSize.label, + // isScrollable: true, + tabs: const [ + // _tab(0, "被叫接听"),_tab(1, "主叫接听"), + Tab(text: "被叫拒接/未接",),Tab(text: "主叫拒接/未接",) - _getList() { - return EasyRefresh( - firstRefresh: true, - header: MaterialHeader(), - footer: MaterialFooter(), - controller: _easyRefreshController, - onRefresh: () async { - await userProvider.updateUserInfo(); - userProvider.updateRefSms(); - updateList(); - setState(() {}); - }, - child: ListView.builder( - itemBuilder: (context, index) { - return _getBox(textListSMS[index], index); - }, - itemCount: textListSMS.length, - ), - ); - } + ]), - _getBox(String content, int index) { - return GestureDetector( - onTap: () async { - if (content != "自定义短信内容") { - BaseModel res = await apiClient.request(API.app.checked, - data: {'id': smsIdList[index], 'status': 2}); - if (res.code == 0) { - setState(() {}); - userProvider.updateUserInfo(); - userProvider.updateRefSms(); - _easyRefreshController.callRefresh(); - } else { - CloudToast.show(res.msg); - } - } else { - if (userProvider.userInfo.isVip==1) { - if (textListSMS.length > 5) { - BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); - } else { - Get.to(AddSmsPage( - status: 2, - ploneBack: (String textContent) { - _easyRefreshController.callRefresh(); - }, - )); - } - } else { - BotToast.showText(text: '请先开通会员'); - } - } - setState(() {}); - }, - onLongPress: () { + ), + Expanded( + child: TabBarView(controller: _tabController, children: [ + // _getBox(), + CallingIdleList( + // contant: const [], + refreshController: _callingRefreshController, isIdle: false, + ), + CallingIdleList( + // contant: const [], + refreshController: _callingRefreshController, isIdle: true, + ) + ])) + ], + )); + } - if (content != "自定义短信内容") { - if (textListSMS.length == 2 || isCheck == index) { - if(textListSMS.length == 2){ - BotToast.showText(text: '最后一条内容不可删除'); - }else if(isCheck == index){ - BotToast.showText(text: '当前为选中内容,不可删除'); - } - } else { - showDialog( - context: context, - builder: (context) { - return Centertipsalterwidget( - desText: '你确定要删除这个短信模版吗,删除之后无法还原。', - title: '删除短信模板', - id: smsIdList[index], - callback: (bool status) { - _easyRefreshController.callRefresh(); - }, - ); - }); - } - } - setState(() {}); - }, - child: - Container( - // width: 686.w, - height: 128.w, - margin: EdgeInsets.only(top: 32.w, left: 64.w, right: 64.w), - padding: EdgeInsets.only(left: 40.w,top: 45.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), - gradient: LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [ - index==isCheck? const Color(0xFF13CA9D):const Color(0xFFF9F9F9), - index==isCheck? const Color(0xFF72E4C8):const Color(0xFFF9F9F9), - ]), + _getBox() { + return Container( + color: Colors.red, + width: 200.w, + height: 200.w, + ); + } - ), - child: Text( - content, - style: TextStyle( - fontSize: BaseStyle.fontSize28, - color: index==isCheck?const Color(0xFFF9F9F9):BaseStyle.color333333, - fontWeight: FontWeight.bold), - ), - ), + _tab(int int, String string) { + return Text( + string, + style: TextStyle( + fontSize: BaseStyle.fontSize28, color:const Color(0xFF1890FF) ), ); } - // int _getEasyRefresh(){ - // return EasyRefresh(onRefresh: ,child: ,); - // } - // _getEditContent(){ - // return GestureDetector( - // onTap: (){ - // if (userProvider.userInfo.isVip==1) { - // if (textListSMS.length > 5) { - // BotToast.showText(text: '自定义数量已达上限,请先删除不需要的短信'); - // } else { - // Get.to(AddSmsPage( - // status: 2, - // ploneBack: (String textContent) { - // _easyRefreshController.callRefresh(); - // }, - // )); - // } - // } else { - // BotToast.showText(text: '请先开通会员'); - // } - // } - // ,child: Container( - // width: double.infinity, - // height: 128.w, - // margin: EdgeInsets.symmetric(horizontal: 64.w), - // padding: EdgeInsets.only(left: 40.w,top: 45.w), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(16), - // color: const Color(0xFFF9F9F9), - // ), - // child: Text( - // "定义短信内容", - // style: TextStyle( - // fontSize: BaseStyle.fontSize28, - // color: BaseStyle.color333333, - // fontWeight: FontWeight.bold), - // ), - // ),); - // } + + @override + bool get wantKeepAlive => true; } diff --git a/lib/ui/home/home_page.dart b/lib/ui/home/home_page.dart index e453f8f..92a1f36 100644 --- a/lib/ui/home/home_page.dart +++ b/lib/ui/home/home_page.dart @@ -114,10 +114,11 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver { onTap: () { if(!(sms && plone && callLog && kg)){ if(!(sms && plone && callLog )){ - BotToast.showText(text: '功能开关未开启'); + Get.to(()=>const PrivacyRightsPage(name: "权限说明")); // Get.to(()=>const TabNavigator(index: 1,)); }else{ - Get.to(()=>const PrivacyRightsPage(name: "权限说明")); + BotToast.showText(text: '功能开关未开启'); + } } // print(); @@ -192,12 +193,12 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver { _getContainer(String title, String text, String image, Color cl1, Color cl2) { return GestureDetector( onTap: () { - print(title); + // print(title); if (title == "接听后") { Get.to(() => const ContentConnectPage()); } else { Get.to(() => const ContentRefusePage()); - print("未接听"); + // print("未接听"); } }, child: Container( diff --git a/lib/ui/loading.dart b/lib/ui/loading.dart index fe4e10c..7e618f9 100644 --- a/lib/ui/loading.dart +++ b/lib/ui/loading.dart @@ -57,7 +57,7 @@ class _LoadingState extends State<Loading> { bottom: 158.w, left: 143.w, child: Image.asset( - Assets.images.Start.path,width:434.sp,height:148.sp , fit: BoxFit.fill),), + Assets.images.start.path,width:434.sp,height:148.sp , fit: BoxFit.fill),), ], )); diff --git a/lib/ui/login/login_page.dart b/lib/ui/login/login_page.dart index 9108997..0029904 100644 --- a/lib/ui/login/login_page.dart +++ b/lib/ui/login/login_page.dart @@ -355,7 +355,7 @@ class _LoginPageState extends State<LoginPage> { TextSpan( text: '《短信帮手隐私协议》', style: TextStyle(color: kPrimaryColor, fontSize: 12 * 2.sp), - recognizer: _recognizer(context, 1)), + recognizer: _recognizer(context, 2)), ])) ], ), diff --git a/lib/ui/user/members_page.dart b/lib/ui/user/members_page.dart index 11312d9..5a308f1 100644 --- a/lib/ui/user/members_page.dart +++ b/lib/ui/user/members_page.dart @@ -74,6 +74,7 @@ class _MembersPageState extends State<MembersPage> { } void _paySuccess() { _easyRefreshController.callRefresh(); + // Get.offAll(const TabNavigator(index: 1,)); } @override Widget build(BuildContext context) { @@ -121,15 +122,15 @@ class _MembersPageState extends State<MembersPage> { Get.snackbar('提示', "请先选择充值月份"); } else { if (_selectIndex == 0) { - print("这是数据${_piceList[_selectIndex].pice}"); - _wxPayFunc(_piceList[_selectIndex].pice); + // print("这是数据${_chooseItem?.pice}"); + _wxPayFunc(_chooseItem?.pice); } else { var result = await isAliPayInstalled(); // 这里判断是否安装支付宝 if (!result) { Get.snackbar('提示', "请先安装支付宝"); } else { - _aliPay(); + _aliPay(_chooseItem?.pice); // aliPay("paySign").then((payResult) { // // map["paySign"]是请求接口返回的字符串直接放进去就好了 // print("支付宝:$payResult"); @@ -249,14 +250,14 @@ class _MembersPageState extends State<MembersPage> { ); } - Future _wxPayFunc(double pay) async { + Future _wxPayFunc(double? pay) async { bool isInstalled = await fluwx.isWeChatInstalled; if (!isInstalled) { BotToast.showText(text: "请先安装微信"); return; } //调起支付 - _wxPay(pay); + _wxPay(pay!); // var wxPayModel = WxPayModel.fromJson({ // "prepayId": "wx121434071826969924754d7d3309520000", // "partnerId": "1622850618", @@ -291,9 +292,9 @@ class _MembersPageState extends State<MembersPage> { // } // } // - Future _aliPay() async { + Future _aliPay(double? pay) async { var base = await apiClient.request(API.pay.alipay, data: { - 'amount': nowPrice,//注释 + 'amount': pay,//注释 // 'amount': 0.01, }); if (base.code == 0) { diff --git a/lib/ui/user/privacy_rights_page.dart b/lib/ui/user/privacy_rights_page.dart index 5579b0f..461f9b8 100644 --- a/lib/ui/user/privacy_rights_page.dart +++ b/lib/ui/user/privacy_rights_page.dart @@ -1,12 +1,15 @@ + import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:project_telephony/base/base_style.dart'; -import 'package:project_telephony/ui/user/privacy_rights_page.dart'; + import 'package:project_telephony/ui/widget/plone_back_button.dart'; import 'package:project_telephony/utils/headers.dart'; import 'package:url_launcher/url_launcher.dart'; + + class PrivacyRightsPage extends StatefulWidget { final String name; diff --git a/lib/ui/user/user_page.dart b/lib/ui/user/user_page.dart index 4a72bad..6f30052 100644 --- a/lib/ui/user/user_page.dart +++ b/lib/ui/user/user_page.dart @@ -63,6 +63,23 @@ class _UserPageState extends State<UserPage> { super.initState(); // _easyRefreshController.callRefresh(); // UserTool.userProvider.updateUserInfo(); + // if (UserTool.userProvider.isLogin) { + // // print(UserTool.userProvider.userInfo.end * 1000); + // // print(DateTime.now().millisecondsSinceEpoch); + // if (UserTool.userProvider.userInfo.isVip != 1) { + // isVip = false; + // vle = false; + // } else { + // isVip = true; + // vle = await service.isRunning(); + // } + // //service.isRunning() as bool; + // // endDate = DateUtil.formatDateMs( + // // UserTool.userProvider.userInfo.end * 1000, + // // format: DateFormats.y_mo_d); + // } else { + // vle = false; + // } } @@ -84,6 +101,7 @@ class _UserPageState extends State<UserPage> { header: MaterialHeader(), onRefresh: () async { // _load(); + _getRequests(); // await UserTool.userProvider.updateUserInfo(); if (UserTool.userProvider.isLogin) { // print(UserTool.userProvider.userInfo.end * 1000); @@ -237,6 +255,23 @@ class _UserPageState extends State<UserPage> { UserTool.userProvider.userInfo.end * 1000, format: DateFormats.y_mo_d); UserTool.userProvider.updateUserInfo(); + if (UserTool.userProvider.isLogin) { + // print(UserTool.userProvider.userInfo.end * 1000); + // print(DateTime.now().millisecondsSinceEpoch); + if (UserTool.userProvider.userInfo.isVip != 1) { + isVip = false; + vle = false; + } else { + isVip = true; + vle = await service.isRunning(); + } + //service.isRunning() as bool; + // endDate = DateUtil.formatDateMs( + // UserTool.userProvider.userInfo.end * 1000, + // format: DateFormats.y_mo_d); + } else { + vle = false; + } setState(() {}); } diff --git a/lib/ui/widget/plone_back_button.dart b/lib/ui/widget/plone_back_button.dart index 5773d4b..9cbb82f 100644 --- a/lib/ui/widget/plone_back_button.dart +++ b/lib/ui/widget/plone_back_button.dart @@ -18,7 +18,11 @@ class CloudBackButton extends StatelessWidget { ? Padding( padding: isSpecial ? EdgeInsets.only(left: 8.w) : EdgeInsets.zero, child: IconButton( - onPressed: () => Navigator.pop(context,true), + onPressed: () { + print("返回传值"); + Navigator.pop(context,true); + + }, icon: Icon( CupertinoIcons.chevron_back, color: color, diff --git a/pubspec.lock b/pubspec.lock index 6119083..35ae3bc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1018,6 +1018,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0+2" + tab_indicator_styler: + dependency: "direct main" + description: + name: tab_indicator_styler + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" telephony: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 90de2fd..8f502b4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -91,7 +91,8 @@ dependencies: flutter_easyrefresh: ^2.2.1 # 链接 url_launcher: ^6.1.5 - +#tabBar样式切换 + tab_indicator_styler: ^2.0.0 # # jdk # jverify: ^2.2.5 ## pub 集成