root_page.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:amap_flutter_location/amap_flutter_location.dart';
  5. import 'package:amap_flutter_location/amap_location_option.dart';
  6. import 'package:bbyyy/beans/coupon_bean_entity.dart';
  7. import 'package:bbyyy/beans/user_bean_entity.dart';
  8. import 'package:bbyyy/https/MyDio.dart';
  9. import 'package:bbyyy/https/my_request.dart';
  10. import 'package:bbyyy/my_tools/dims.dart';
  11. import 'package:bbyyy/my_tools/easy_loading/easy_loading.dart';
  12. import 'package:bbyyy/my_tools/event_bus.dart';
  13. import 'package:bbyyy/my_tools/my_cookie.dart';
  14. import 'package:bbyyy/my_tools/my_datas.dart';
  15. import 'package:bbyyy/my_tools/my_tools.dart';
  16. import 'package:bbyyy/my_tools/pop_up_queue.dart';
  17. import 'package:bbyyy/nsq/nsq.dart' as Nsq;
  18. import 'package:bbyyy/paegs/gang_page/gang_page.dart';
  19. import 'package:bbyyy/paegs/home_page/home_page.dart';
  20. import 'package:bbyyy/paegs/mine_page/mine_page.dart';
  21. import 'package:bbyyy/paegs/mine_page/order_page/order_page.dart';
  22. import 'package:bbyyy/paegs/msg_page/msg_page.dart';
  23. import 'package:bbyyy/paegs/root_page/root_page_view.dart';
  24. import 'package:flutter/cupertino.dart';
  25. import 'package:flutter/material.dart';
  26. import 'package:flutter/services.dart';
  27. import 'package:flutter_svg/flutter_svg.dart';
  28. import 'package:permission_handler/permission_handler.dart';
  29. class RootPage extends StatefulWidget {
  30. @override
  31. _RootPageState createState() => _RootPageState();
  32. }
  33. class _RootPageState extends State<RootPage> {
  34. PageController pageController = PageController(initialPage: 0);
  35. DateTime lastPopTime;
  36. AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();
  37. Map<String, Object> _locationResult;
  38. StreamSubscription<Map<String, Object>> _locationListener;
  39. @override
  40. void initState() {
  41. super.initState();
  42. MyCookie().initP();
  43. if (Platform.isIOS) {
  44. requestAccuracyAuthorization();
  45. }
  46. _locationListener = _locationPlugin.onLocationChanged().listen((Map<String, Object> result) {
  47. result.forEach((key, value) {
  48. print('$key---------------$value');
  49. });
  50. setState(() {
  51. _locationResult = result;
  52. });
  53. });
  54. getLocation();
  55. Nsq.ConnectServer(
  56. Nsq.handlerMessage, // 接收消息处理逻辑
  57. // serverIp: '172.16.104.14',
  58. serverIp: MyCookie().server,
  59. // 服务端返回
  60. serverPort: 4150,
  61. // 服务端返回
  62. topic: '${MyCookie().getUID()}',
  63. // 主题订阅,服务端返回
  64. channel: '${MyCookie().getUID()}',
  65. // 服务端返回uid
  66. clientId: '客户uid',
  67. // 服务端返回uid
  68. hostname: '主机名', // 服务端返回
  69. );
  70. EventBus().emit('检查粘贴板');
  71. EventBus().on('ChangePage', (arg) {
  72. if (RootPageView().bNIndex == 3) {
  73. queryPersonalInformation();
  74. }
  75. pageController.jumpToPage(RootPageView().bNIndex);
  76. setState(() {});
  77. });
  78. EventBus().on('hasNoPay', (arg) {
  79. setState(() {});
  80. });
  81. MyData().init(context);
  82. queryPersonalInformation();
  83. checkForUpdates(context);
  84. Future.delayed(Duration(seconds: 1), () {
  85. checkCouponEvent();
  86. });
  87. }
  88. @override
  89. void dispose() {
  90. // TODO: implement dispose
  91. EventBus().off('ChangePage');
  92. EventBus().off('hasNoPay');
  93. ///移除定位监听
  94. if (null != _locationListener) {
  95. _locationListener?.cancel();
  96. }
  97. ///销毁定位
  98. _locationPlugin.destroy();
  99. super.dispose();
  100. }
  101. @override
  102. Widget build(BuildContext context) {
  103. return WillPopScope(
  104. onWillPop: () async {
  105. if (lastPopTime == null ||
  106. DateTime.now().difference(lastPopTime) > Duration(seconds: 2)) {
  107. lastPopTime = DateTime.now();
  108. EasyLoading.showToast('再按一次退出');
  109. } else {
  110. lastPopTime = DateTime.now();
  111. await SystemChannels.platform.invokeMethod('SystemNavigator.pop');
  112. }
  113. return false;
  114. },
  115. child: Scaffold(
  116. resizeToAvoidBottomInset: false,
  117. backgroundColor: Colors.transparent,
  118. body: Stack(
  119. children: [
  120. Column(
  121. children: [
  122. Expanded(
  123. child: PageView(
  124. controller: pageController,
  125. children: [HomePage(), GangPage(), MsgPage(), MinePage()],
  126. physics: NeverScrollableScrollPhysics(),
  127. ),
  128. ),
  129. RootPageView().bottomNavigationBar(),
  130. ],
  131. ),
  132. if (MyCookie().haveNoPay)
  133. Positioned(
  134. bottom: 60,
  135. right: 0,
  136. child: SafeArea(
  137. top: false,
  138. child: GestureDetector(
  139. onTap: () {
  140. MyTools().toPage(
  141. context,
  142. OrderPage(
  143. index: 2,
  144. ), (then) {
  145. queryPersonalInformation();
  146. });
  147. },
  148. behavior: HitTestBehavior.translucent,
  149. child: Container(
  150. height: 44,
  151. width: 100,
  152. padding: EdgeInsets.symmetric(horizontal: 10),
  153. child: Row(
  154. children: [
  155. SvgPicture.asset(
  156. 'images/svg/订单.svg',
  157. color: Colors.white,
  158. height: 15,
  159. width: 15,
  160. ),
  161. Text(
  162. '未付订单',
  163. style: TextStyle(color: Colors.white, fontSize: 14),
  164. )
  165. ],
  166. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  167. ),
  168. decoration: BoxDecoration(
  169. color: Colors.amber,
  170. borderRadius: BorderRadius.only(
  171. topLeft: Radius.circular(22),
  172. bottomLeft: Radius.circular(22),
  173. ),
  174. ),
  175. ),
  176. ),
  177. ),
  178. ),
  179. ],
  180. ),
  181. ),
  182. );
  183. }
  184. void queryPersonalInformation() {
  185. MyDio().query({
  186. "key": "user",
  187. "filters": {
  188. "conditions": ["uid == ${MyCookie().getUID()}"]
  189. },
  190. "dims": userDims,
  191. "paging": [1, 20]
  192. }, (response, hasError) {
  193. if (!hasError) {
  194. UserBeanEntity entity =
  195. UserBeanEntity().fromJson(json.decode(response.data.toString()));
  196. MyCookie().userBean = entity.data.data[0];
  197. EventBus().emit('userChange');
  198. }
  199. }, (error) {});
  200. }
  201. Future<void> getLocation() async {
  202. var locationStatus = await Permission.location.status;
  203. var cameraStatus = await Permission.camera.status;
  204. print('Permission.location.status--------------$locationStatus');
  205. print('Permission.camera.status--------------$cameraStatus');
  206. if (locationStatus.isDenied) {
  207. await Permission.location.request().then((value) async {
  208. print('Permission.location.request()-----$value');
  209. if (value == PermissionStatus.granted) {
  210. _setLocationOption();
  211. _locationPlugin.startLocation();
  212. }
  213. });
  214. } else if (locationStatus.isGranted) {
  215. _setLocationOption();
  216. _locationPlugin.startLocation();
  217. }
  218. if (cameraStatus.isDenied) {
  219. await Permission.camera.request().then((value) {
  220. print('Permission.camera.request()-----$value');
  221. });
  222. }
  223. }
  224. //查询优惠券活动
  225. checkCouponEvent() {
  226. MyDio().query({
  227. "key": "coupon_distribute",
  228. "filters": {
  229. "conditions": ["valid==true"],
  230. },
  231. "dims": couponDistributeDims,
  232. "paging": [1, 100]
  233. }, (response, hasError) {
  234. if (!hasError) {
  235. CouponBeanEntity entity =
  236. CouponBeanEntity().fromJson(json.decode(response.data.toString()));
  237. PopUpQueue().coupon.addAll(entity.data.data);
  238. }
  239. }, (error) {});
  240. }
  241. void requestAccuracyAuthorization() async {
  242. AMapAccuracyAuthorization currentAccuracyAuthorization = await _locationPlugin.getSystemAccuracyAuthorization();
  243. if (currentAccuracyAuthorization == AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
  244. print("精确定位类型");
  245. } else if (currentAccuracyAuthorization == AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
  246. print("模糊定位类型");
  247. } else {
  248. print("未知定位类型");
  249. }
  250. }
  251. void _setLocationOption() {
  252. AMapLocationOption locationOption = new AMapLocationOption();
  253. ///是否单次定位
  254. locationOption.onceLocation = true;
  255. ///是否需要返回逆地理信息
  256. locationOption.needAddress = true;
  257. ///逆地理信息的语言类型
  258. locationOption.geoLanguage = GeoLanguage.DEFAULT;
  259. locationOption.desiredLocationAccuracyAuthorizationMode = AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
  260. locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
  261. ///设置Android端连续定位的定位间隔
  262. locationOption.locationInterval = 2000;
  263. ///设置Android端的定位模式<br>
  264. ///可选值:<br>
  265. ///<li>[AMapLocationMode.Battery_Saving]</li>
  266. ///<li>[AMapLocationMode.Device_Sensors]</li>
  267. ///<li>[AMapLocationMode.Hight_Accuracy]</li>
  268. locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
  269. ///设置iOS端的定位最小更新距离<br>
  270. locationOption.distanceFilter = -1;
  271. ///设置iOS端期望的定位精度
  272. /// 可选值:<br>
  273. /// <li>[DesiredAccuracy.Best] 最高精度</li>
  274. /// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
  275. /// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
  276. /// <li>[DesiredAccuracy.Kilometer] 1000米</li>
  277. /// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
  278. locationOption.desiredAccuracy = DesiredAccuracy.Best;
  279. ///设置iOS端是否允许系统暂停定位
  280. locationOption.pausesLocationUpdatesAutomatically = false;
  281. ///将定位参数设置给定位插件
  282. _locationPlugin.setLocationOption(locationOption);
  283. }
  284. }