import 'dart:async'; import 'dart:ui'; import 'package:flustars/flustars.dart' as FlutterStars; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:liftmanager/common/common.dart'; import 'package:liftmanager/internal/account/account_router.dart'; import 'package:liftmanager/internal/bbs/page/bbs_page.dart'; import 'package:liftmanager/internal/bbs/page/hospital_page.dart'; import 'package:liftmanager/internal/friends/page/friends_list.dart'; import 'package:liftmanager/internal/home/provider/home_provider.dart'; import 'package:liftmanager/internal/wode/model/version_item.dart'; import 'package:liftmanager/internal/wode/page/wode_page.dart'; import 'package:liftmanager/internal/work/page/work_page.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/res/resources.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/utils/image_utils.dart'; import 'package:liftmanager/utils/theme_utils.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/widgets/update_dialog.dart'; import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; import 'package:uni_links/uni_links.dart'; class HomePage extends StatefulWidget { @override _HomeState createState() => _HomeState(); } class _HomeState extends State { var _pageList = [ BbsPage(), FriendsList(), HospitalPage(), WorkPage(), WodePage(), ]; final _pageController = PageController(); VersionItem versionItem = VersionItem(); HomeProvider provider = HomeProvider(); List _list; double devicesHeight = window.physicalSize.height; Offset idleOffset = Offset(0, 0); Offset moveOffset = Offset(99999, 99999); Offset lastStartOffset = Offset(0, 0); PackageInfo packageInfo; @override void initState() { super.initState(); initUniLinks(); WidgetsBinding.instance.addPostFrameCallback((_) async { getNewVersion(); }); } getNewVersion() async { packageInfo = await PackageInfo.fromPlatform(); ApiService(context: context).version( onSuccess: (res) { if (res != null) { versionItem = res; int versionCode = FlutterStars.SpUtil.getInt("version_code") ?? 0; if (hasNewVersion(packageInfo.version, versionItem.version)) { _showUpdateDialog(); } setState(() {}); } }, onError: (code, msg) {}); } bool hasNewVersion(version, newversion) { try { var currentVersionArr = version.version.split('.').map((e) => int.parse(e)).toList(); var newVersionArr = newversion.split('.').map((e) => int.parse(e)).toList(); if (currentVersionArr[0] < newVersionArr[0]) { return true; } if (currentVersionArr[1] < newVersionArr[1]) { return true; } if (currentVersionArr[2] < newVersionArr[2]) { return true; } } catch (e) { return false; } return false; } void _showUpdateDialog() { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return UpdateDialog( content: versionItem.content, url: versionItem.url, code: versionItem.code, version: versionItem.version, forceUpdate: versionItem.forceUpdate == 1 ? true : false, ); }); } showAlertEvent() { showAlert( context, "提示", "确定登录?", "确定", () { NavigatorUtils.push(context, AccountRouter.loginPage, clearStack: true); }, txt2: "取消", onPre2: () { // NavigatorUtils.goBack(context); // provider.value = 0; //跳转到home Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => HomePage()), (route) => route == null); }, ); } String initialLink; Uri initialUri; @override dispose() { if (_sub != null) _sub.cancel(); super.dispose(); } double middleSize = 60; List _buildBottomNavigationBarItem() { var data = [ { 'name': '首页', 'icon': Image.asset(ImageUtils.getImgPath('home_icon')), 'icon2': Image.asset(ImageUtils.getImgPath('home_icon_selected')), }, { 'name': '圈子', 'icon': Image.asset(ImageUtils.getImgPath('circle_icon')), 'icon2': Image.asset(ImageUtils.getImgPath('circle_icon_selected')), }, { 'name': '医院', 'icon': Image.asset(ImageUtils.getImgPath('stethoscope_icon')), 'icon2': Image.asset(ImageUtils.getImgPath('stethoscope_icon_selected')), }, { 'name': '工作台', 'icon': Image.asset(ImageUtils.getImgPath('handcase_icon')), 'icon2': Image.asset(ImageUtils.getImgPath('handcase_icon_selected')), }, { 'name': '我的', 'icon': Image.asset(ImageUtils.getImgPath('puppet_icon')), 'icon2': Image.asset(ImageUtils.getImgPath('puppet_icon_selected')), } ]; _list = data .map( (e) => BottomNavigationBarItem( icon: e['icon'], activeIcon: e['icon2'], label: e['name'], ), ) .toList(); return _list; } DateTime _lastTime; Future _isExit() { if (_lastTime == null || DateTime.now().difference(_lastTime) > Duration(milliseconds: 2500)) { _lastTime = DateTime.now(); toasts("再次点击退出应用"); return Future.value(false); } // Toast.cancelToast(); return Future.value(true); } StreamSubscription _sub; Future initUniLinks() async { print('------获取参数--------'); // Platform messages may fail, so we use a try/catch PlatformException. _sub = getLinksStream().listen((String link) { Uri u = Uri.parse(link); String path = u.queryParameters['page']; String id = u.queryParameters['id']; print('path'); print(path); print(context); if (path.isNotEmpty && (FlutterStars.SpUtil.getString(Constant.userId) != "-1" || (FlutterStars.SpUtil.getString(Constant.userId) == "-1" && path != "/wode/vip"))) { NavigatorUtils.push(context, "$path?id=$id"); } else if (FlutterStars.SpUtil.getString(Constant.userId) == "-1" && path == "/wode/vip") { showAlertEvent(); } print('---213---'); print(link); // Parse the link and warn the user, if it is not correct }, onError: (err) { // Handle exception by warning the user their action did not succeed }); initialLink = null; initialUri = null; // FlutterStars.SpUtil.putBool('isInitLink', false); // FlutterStars.SpUtil.getBool('isInitLink'); if (FlutterStars.SpUtil.getBool('isInitLink') == null) { FlutterStars.SpUtil.putBool('isInitLink', false); } if (FlutterStars.SpUtil.getBool('isInitLink')) { initialLink = await getInitialLink(); // toasts('initial link: $initialLink'); if (initialLink != null) { initialUri = Uri.parse(initialLink); String path = initialUri.queryParameters['page']; String id = initialUri.queryParameters['id']; print('path'); // toasts(path); // toasts("444"); print(context); if (path.isNotEmpty && (FlutterStars.SpUtil.getString(Constant.userId) != "-1" || (FlutterStars.SpUtil.getString(Constant.userId) == "-1" && path != "/wode/vip"))) { NavigatorUtils.push(context, "$path?id=$id"); } else if (FlutterStars.SpUtil.getString(Constant.userId) == "-1" && path == "/wode/vip") { showAlert( context, "提示", "确定登录?", "确定", () { NavigatorUtils.push(context, AccountRouter.loginPage, clearStack: true); }, txt2: "取消", onPre2: () { NavigatorUtils.goBack(context); //跳转到home }, ); } } } FlutterStars.SpUtil.putBool('isInitLink', true); } @override Widget build(BuildContext context) { // ScreenUtil.instance = ScreenUtil(width: 750,height:1334)..init(context); double height = MediaQuery.of(context).size.height; double width = MediaQuery.of(context).size.width; ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context); return ChangeNotifierProvider( create: (_) => provider, child: WillPopScope( onWillPop: _isExit, child: Container( color: Colors.white, child: SafeArea( top: false, bottom: false, child: Stack(children: [ Scaffold( bottomNavigationBar: Consumer( builder: (_, provider, __) { return BottomNavigationBar( backgroundColor: ThemeUtils.getTabsBg(context), items: _buildBottomNavigationBarItem(), type: BottomNavigationBarType.fixed, currentIndex: provider.value, // elevation: 2, iconSize: 21.0, selectedFontSize: Dimens.font_sp10, unselectedFontSize: Dimens.font_sp10, selectedItemColor: Theme.of(context).primaryColor, unselectedItemColor: Colours.unselected_item_color, onTap: (index) { _pageController.jumpToPage(index); setState(() { middleSize = 60; }); }, ); }, ), // 使用PageView的原因参看 https://zhuanlan.zhihu .com/p/58582876 body: PageView( controller: _pageController, onPageChanged: _onPageChanged, children: _pageList, physics: NeverScrollableScrollPhysics(), ), // 禁止滑动 ), ]))), )); } void _onPageChanged(int index) { if (index != 0 && FlutterStars.SpUtil.getString(Constant.userId) == "-1") { showAlertEvent(); } provider.value = index; } }