home_page.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import 'dart:async';
  2. import 'dart:ui';
  3. import 'package:flustars/flustars.dart' as FlutterStars;
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:liftmanager/common/common.dart';
  7. import 'package:liftmanager/internal/account/account_router.dart';
  8. import 'package:liftmanager/internal/bbs/page/bbs_page.dart';
  9. import 'package:liftmanager/internal/bbs/page/hospital_page.dart';
  10. import 'package:liftmanager/internal/friends/page/friends_list.dart';
  11. import 'package:liftmanager/internal/home/provider/home_provider.dart';
  12. import 'package:liftmanager/internal/wode/model/version_item.dart';
  13. import 'package:liftmanager/internal/wode/page/wode_page.dart';
  14. import 'package:liftmanager/internal/work/page/work_page.dart';
  15. import 'package:liftmanager/net/api_service.dart';
  16. import 'package:liftmanager/res/resources.dart';
  17. import 'package:liftmanager/routers/fluro_navigator.dart';
  18. import 'package:liftmanager/utils/image_utils.dart';
  19. import 'package:liftmanager/utils/theme_utils.dart';
  20. import 'package:liftmanager/utils/toast.dart';
  21. import 'package:liftmanager/widgets/update_dialog.dart';
  22. import 'package:package_info/package_info.dart';
  23. import 'package:provider/provider.dart';
  24. import 'package:uni_links/uni_links.dart';
  25. class HomePage extends StatefulWidget {
  26. @override
  27. _HomeState createState() => _HomeState();
  28. }
  29. class _HomeState extends State<HomePage> {
  30. var _pageList = [
  31. BbsPage(),
  32. FriendsList(),
  33. HospitalPage(),
  34. WorkPage(),
  35. WodePage(),
  36. ];
  37. final _pageController = PageController();
  38. VersionItem versionItem = VersionItem();
  39. HomeProvider provider = HomeProvider();
  40. List<BottomNavigationBarItem> _list;
  41. double devicesHeight = window.physicalSize.height;
  42. Offset idleOffset = Offset(0, 0);
  43. Offset moveOffset = Offset(99999, 99999);
  44. Offset lastStartOffset = Offset(0, 0);
  45. PackageInfo packageInfo;
  46. @override
  47. void initState() {
  48. super.initState();
  49. initUniLinks();
  50. WidgetsBinding.instance.addPostFrameCallback((_) async {
  51. getNewVersion();
  52. });
  53. }
  54. getNewVersion() async {
  55. packageInfo = await PackageInfo.fromPlatform();
  56. ApiService(context: context).version(
  57. onSuccess: (res) {
  58. if (res != null) {
  59. versionItem = res;
  60. int versionCode = FlutterStars.SpUtil.getInt("version_code") ?? 0;
  61. if (versionItem.code > versionCode &&
  62. versionItem.code > int.parse(packageInfo.buildNumber)) {
  63. _showUpdateDialog();
  64. }
  65. setState(() {});
  66. }
  67. },
  68. onError: (code, msg) {});
  69. }
  70. void _showUpdateDialog() {
  71. showDialog(
  72. context: context,
  73. barrierDismissible: false,
  74. builder: (BuildContext context) {
  75. return UpdateDialog(
  76. content: versionItem.content,
  77. url: versionItem.url,
  78. code: versionItem.code,
  79. version: versionItem.version,
  80. forceUpdate: versionItem.forceUpdate == 1 ? true : false,
  81. );
  82. });
  83. }
  84. showAlertEvent() {
  85. showAlert(
  86. context,
  87. "提示",
  88. "确定登录?",
  89. "确定",
  90. () {
  91. NavigatorUtils.push(context, AccountRouter.loginPage, clearStack: true);
  92. },
  93. txt2: "取消",
  94. onPre2: () {
  95. // NavigatorUtils.goBack(context);
  96. // provider.value = 0;
  97. //跳转到home
  98. Navigator.of(context).pushAndRemoveUntil(
  99. MaterialPageRoute(builder: (context) => HomePage()),
  100. (route) => route == null);
  101. },
  102. );
  103. }
  104. String initialLink;
  105. Uri initialUri;
  106. @override
  107. dispose() {
  108. if (_sub != null) _sub.cancel();
  109. super.dispose();
  110. }
  111. double middleSize = 60;
  112. List<BottomNavigationBarItem> _buildBottomNavigationBarItem() {
  113. var data = [
  114. {
  115. 'name': '首页',
  116. 'icon': Image.asset(ImageUtils.getImgPath('home_icon')),
  117. 'icon2': Image.asset(ImageUtils.getImgPath('home_icon_selected')),
  118. },
  119. {
  120. 'name': '圈子',
  121. 'icon': Image.asset(ImageUtils.getImgPath('circle_icon')),
  122. 'icon2': Image.asset(ImageUtils.getImgPath('circle_icon_selected')),
  123. },
  124. {
  125. 'name': '医院',
  126. 'icon': Image.asset(ImageUtils.getImgPath('stethoscope_icon')),
  127. 'icon2':
  128. Image.asset(ImageUtils.getImgPath('stethoscope_icon_selected')),
  129. },
  130. {
  131. 'name': '工作台',
  132. 'icon': Image.asset(ImageUtils.getImgPath('handcase_icon')),
  133. 'icon2': Image.asset(ImageUtils.getImgPath('handcase_icon_selected')),
  134. },
  135. {
  136. 'name': '我的',
  137. 'icon': Image.asset(ImageUtils.getImgPath('puppet_icon')),
  138. 'icon2': Image.asset(ImageUtils.getImgPath('puppet_icon_selected')),
  139. }
  140. ];
  141. _list = data
  142. .map<BottomNavigationBarItem>(
  143. (e) => BottomNavigationBarItem(
  144. icon: e['icon'],
  145. activeIcon: e['icon2'],
  146. label: e['name'],
  147. ),
  148. )
  149. .toList();
  150. return _list;
  151. }
  152. DateTime _lastTime;
  153. Future<bool> _isExit() {
  154. if (_lastTime == null ||
  155. DateTime.now().difference(_lastTime) > Duration(milliseconds: 2500)) {
  156. _lastTime = DateTime.now();
  157. toasts("再次点击退出应用");
  158. return Future.value(false);
  159. }
  160. // Toast.cancelToast();
  161. return Future.value(true);
  162. }
  163. StreamSubscription _sub;
  164. Future<void> initUniLinks() async {
  165. print('------获取参数--------');
  166. // Platform messages may fail, so we use a try/catch PlatformException.
  167. _sub = getLinksStream().listen((String link) {
  168. Uri u = Uri.parse(link);
  169. String path = u.queryParameters['page'];
  170. String id = u.queryParameters['id'];
  171. print('path');
  172. print(path);
  173. print(context);
  174. if (path.isNotEmpty &&
  175. (FlutterStars.SpUtil.getString(Constant.userId) != "-1" ||
  176. (FlutterStars.SpUtil.getString(Constant.userId) == "-1" &&
  177. path != "/wode/vip"))) {
  178. NavigatorUtils.push(context, "$path?id=$id");
  179. } else if (FlutterStars.SpUtil.getString(Constant.userId) == "-1" &&
  180. path == "/wode/vip") {
  181. showAlertEvent();
  182. }
  183. print('---213---');
  184. print(link);
  185. // Parse the link and warn the user, if it is not correct
  186. }, onError: (err) {
  187. // Handle exception by warning the user their action did not succeed
  188. });
  189. initialLink = null;
  190. initialUri = null;
  191. // FlutterStars.SpUtil.putBool('isInitLink', false);
  192. // FlutterStars.SpUtil.getBool('isInitLink');
  193. if (FlutterStars.SpUtil.getBool('isInitLink') == null) {
  194. FlutterStars.SpUtil.putBool('isInitLink', false);
  195. }
  196. if (FlutterStars.SpUtil.getBool('isInitLink')) {
  197. initialLink = await getInitialLink();
  198. // toasts('initial link: $initialLink');
  199. if (initialLink != null) {
  200. initialUri = Uri.parse(initialLink);
  201. String path = initialUri.queryParameters['page'];
  202. String id = initialUri.queryParameters['id'];
  203. print('path');
  204. // toasts(path);
  205. // toasts("444");
  206. print(context);
  207. if (path.isNotEmpty &&
  208. (FlutterStars.SpUtil.getString(Constant.userId) != "-1" ||
  209. (FlutterStars.SpUtil.getString(Constant.userId) == "-1" &&
  210. path != "/wode/vip"))) {
  211. NavigatorUtils.push(context, "$path?id=$id");
  212. } else if (FlutterStars.SpUtil.getString(Constant.userId) == "-1" &&
  213. path == "/wode/vip") {
  214. showAlert(
  215. context,
  216. "提示",
  217. "确定登录?",
  218. "确定",
  219. () {
  220. NavigatorUtils.push(context, AccountRouter.loginPage,
  221. clearStack: true);
  222. },
  223. txt2: "取消",
  224. onPre2: () {
  225. NavigatorUtils.goBack(context);
  226. //跳转到home
  227. },
  228. );
  229. }
  230. }
  231. }
  232. FlutterStars.SpUtil.putBool('isInitLink', true);
  233. }
  234. @override
  235. Widget build(BuildContext context) {
  236. // ScreenUtil.instance = ScreenUtil(width: 750,height:1334)..init(context);
  237. double height = MediaQuery.of(context).size.height;
  238. double width = MediaQuery.of(context).size.width;
  239. ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context);
  240. return ChangeNotifierProvider<HomeProvider>(
  241. create: (_) => provider,
  242. child: WillPopScope(
  243. onWillPop: _isExit,
  244. child: Container(
  245. color: Colors.white,
  246. child: SafeArea(
  247. top: false,
  248. bottom: false,
  249. child: Stack(children: <Widget>[
  250. Scaffold(
  251. bottomNavigationBar: Consumer<HomeProvider>(
  252. builder: (_, provider, __) {
  253. return BottomNavigationBar(
  254. backgroundColor: ThemeUtils.getTabsBg(context),
  255. items: _buildBottomNavigationBarItem(),
  256. type: BottomNavigationBarType.fixed,
  257. currentIndex: provider.value,
  258. // elevation: 2,
  259. iconSize: 21.0,
  260. selectedFontSize: Dimens.font_sp10,
  261. unselectedFontSize: Dimens.font_sp10,
  262. selectedItemColor: Theme.of(context).primaryColor,
  263. unselectedItemColor: Colours.unselected_item_color,
  264. onTap: (index) {
  265. _pageController.jumpToPage(index);
  266. setState(() {
  267. middleSize = 60;
  268. });
  269. },
  270. );
  271. },
  272. ),
  273. // 使用PageView的原因参看 https://zhuanlan.zhihu .com/p/58582876
  274. body: PageView(
  275. controller: _pageController,
  276. onPageChanged: _onPageChanged,
  277. children: _pageList,
  278. physics: NeverScrollableScrollPhysics(),
  279. ), // 禁止滑动
  280. ),
  281. ]))),
  282. ));
  283. }
  284. void _onPageChanged(int index) {
  285. if (index != 0 && FlutterStars.SpUtil.getString(Constant.userId) == "-1") {
  286. showAlertEvent();
  287. }
  288. provider.value = index;
  289. }
  290. }