tabs.dart 4.6 KB

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