tabs.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:twong/router/base.dart';
  5. import 'package:twong/utils/image_utils.dart';
  6. import 'package:uni_links/uni_links.dart';
  7. import 'package:flutter_app_upgrade/flutter_app_upgrade.dart';
  8. import 'package:twong/utils/index.dart';
  9. import 'package:twong/config/style.dart';
  10. import 'package:twong/models/index.dart';
  11. import 'package:twong/pages/tabs/cart.dart';
  12. import 'package:twong/pages/tabs/home.dart';
  13. import 'package:twong/pages/tabs/user.dart';
  14. import 'package:twong/pages/tabs/wallet.dart';
  15. class Tabs extends StatefulWidget {
  16. @override
  17. State<StatefulWidget> createState() {
  18. return _TabsState();
  19. }
  20. }
  21. class _TabsState extends State<Tabs> with WidgetsBindingObserver {
  22. int _currentIndex = 0;
  23. List<Widget> _pageList;
  24. PageController _pageController;
  25. @override
  26. void initState() {
  27. super.initState();
  28. Request.init();
  29. Notifications.init(context);
  30. WidgetsBinding.instance.addObserver(this);
  31. getLinksStream().listen(_processUrlScheme);
  32. if(!Cache.checked) {
  33. AppUpgrade.appUpgrade(
  34. context,
  35. _checkAppInfo(),
  36. iosAppId: '1537411658',
  37. );
  38. }
  39. _pageController = PageController(initialPage: _currentIndex);
  40. _pageList = [ HomePage(), WalletPage(), CartPage(), UserPage()];
  41. }
  42. @override
  43. void didChangeAppLifecycleState(AppLifecycleState state) {
  44. Log.d("程序切换状态 ${state.toString()}");
  45. switch (state) {
  46. case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
  47. break;
  48. case AppLifecycleState.resumed:// 应用程序可见,前台
  49. _checkUrlScheme();
  50. break;
  51. case AppLifecycleState.paused: // 应用程序不可见,后台
  52. break;
  53. case AppLifecycleState.detached:
  54. break;
  55. }
  56. }
  57. void _checkUrlScheme() async {
  58. String url;
  59. try {
  60. url = await getInitialLink();
  61. if (url == null) return;
  62. _processUrlScheme(url);
  63. } on PlatformException {
  64. Log.e("Failed to get url scheme");
  65. }
  66. }
  67. void _processUrlScheme(String url) {
  68. final Uri uri = Uri.parse(url.replaceFirst('twong://', 'http://'));
  69. Log.d("Get url scheme: ${json.encode(uri.queryParameters).toString()}");
  70. }
  71. void _onItemTap (index) async {
  72. if(Cache.token == null && index != 0) {
  73. await Navigator.pushNamed(context, RouteNames.login);
  74. // 取消登陆 则不进行跳转
  75. if(Cache.token == null) return;
  76. }
  77. setState(() {
  78. _currentIndex = index;
  79. _pageController.jumpToPage(_currentIndex);
  80. });
  81. }
  82. Future<AppUpgradeInfo> _checkAppInfo() async {
  83. return Request.getVersion().then((remote) async {
  84. var version = await FlutterUpgrade.appInfo;
  85. Cache.checked = true;
  86. var local = Version();
  87. local.version = version.versionName;
  88. var need = remote > local;
  89. Log.i("remote:\t${remote.version}\nlocal:\t${local.version}\n"
  90. "${need ? "need update !" :"already is the latest."}");
  91. if (need) {
  92. return AppUpgradeInfo(
  93. title: '新版本${remote.version}',
  94. contents: ['检测到有新版本更新,是否立即下载?'],
  95. force: false,
  96. );
  97. } else {
  98. return null;
  99. }
  100. });
  101. }
  102. @override
  103. Widget build(BuildContext context) {
  104. HYSizeFit.initialize(context);
  105. return Scaffold(
  106. body: GestureDetector(
  107. child: WillPopScope(
  108. onWillPop: () async {
  109. await Utils.backDeskTop();
  110. return false;
  111. },
  112. child: PageView(
  113. controller: _pageController,
  114. physics: NeverScrollableScrollPhysics(),
  115. children: _pageList,
  116. onPageChanged: (index) {
  117. setState(() {
  118. _currentIndex = index;
  119. });
  120. },
  121. ),
  122. ),
  123. ),
  124. bottomNavigationBar: BottomNavigationBar(
  125. elevation: 10,
  126. onTap: _onItemTap,
  127. fixedColor: Colors.black,
  128. currentIndex: _currentIndex,
  129. type: BottomNavigationBarType.fixed,
  130. items: [
  131. BottomNavigationBarItem(icon: _currentIndex == 0
  132. ? Icon(IconFonts.home, color: DColors.Main)
  133. : Icon(IconFonts.home_outline), label: I18n.home),
  134. BottomNavigationBarItem(icon: _currentIndex == 1
  135. ? Icon(IconFonts.wallet, color: DColors.Main)
  136. : Icon(IconFonts.wallet_outline), label: I18n.wallet),
  137. BottomNavigationBarItem(icon: _currentIndex == 2
  138. ? Icon(IconFonts.cart, color: DColors.Main)
  139. : Icon(IconFonts.cart_outline), label: I18n.cart),
  140. BottomNavigationBarItem(icon: _currentIndex == 3
  141. ? Icon(IconFonts.user, color: DColors.Main)
  142. : Icon(IconFonts.user_outline), label: I18n.user),
  143. ],
  144. ),
  145. );
  146. }
  147. }