home_page.dart 12.3 KB
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/app.dart';
import 'package:one_key/pages/message/message_page.dart';
import 'package:one_key/pages/my/my_page.dart';
import 'package:one_key/pages/notebook/notebook_page.dart';
import 'package:one_key/provider/contact_model.dart';
import 'package:one_key/provider/message_dialog_model.dart';
import 'package:one_key/provider/message_model.dart';
import 'package:one_key/provider/my_model.dart';
import 'package:one_key/provider/notebook_model.dart';
import 'package:one_key/provider/tools.dart';
import 'package:one_key/provider/update_model.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/log_util.dart';
import 'package:one_key/utils/misc.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tpns_flutter_plugin/tpns_flutter_plugin.dart';

class HomePage extends StatefulWidget {
  final int initialIndex; //初始tab

  HomePage({this.initialIndex = 1});

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> with WidgetsBindingObserver {
  List<Widget> pages = List<Widget>();
  int _currIndex = 1;
  Color _activeColor = MyColours.color_2bb5b7;
  Color _defaultColor = MyColours.color_bfbfbf;

  Timer timer;

  int xgCount = 1; //注册信鸽次数,最多5次

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    LogUtil.v("home_initState");
    WidgetsBinding.instance.addObserver(this);
    _currIndex = widget.initialIndex;
    pages
      ..add(ChangeNotifierProvider<MessageModel>(
        create: (_) => MessageModel(),
        child: MessagePage(),
      ))
      ..add(ChangeNotifierProvider<NoteBookModel>(
        create: (_) => NoteBookModel(),
        child: NoteBookPage(),
      ))
      ..add(ChangeNotifierProvider<MyModel>(
        create: (_) => MyModel(),
        child: MyPage(),
      ));
    WidgetsBinding.instance.addPostFrameCallback((_){
      initPlatformState();
      if(widget.initialIndex==0)return;
      _getIntent();
      Future.delayed(Duration(milliseconds: 30000), () {
        ContactModel.getInstance().uploadLocalContact(context);
        UpdateModel updateModel = new UpdateModel();
        updateModel.checkUpdate(context, showToast: false);
      });
      timer = Timer.periodic(Duration(minutes: 3), (_) {
        getUntreatedMessage();
      });
    });
  }

  //获取点击通知栏的自定义参数
  _getIntent() async {
    Map param = await Tools().getIntent();
    Map notifyParam=param;
    if(Platform.isIOS&&param!=null){
      notifyParam=json.decode(param['custom'].toString());
    }
    if (notifyParam != null && notifyParam.isNotEmpty) {
      switch (notifyParam["messageType"]) {
        case "10":
          NavigatorUtil.goHandleOnlinePage(
              context, notifyParam["rid"], notifyParam['mid'],
              fromNotify: true);
          break;
        case "11":
          NavigatorUtil.goNotebookDetailPage(context, notifyParam['rid'],mid:notifyParam['mid'],
              fromNotify: true);
          break;
      }
    }else{
      getUntreatedMessage();
    }
  }

  //初始化信鸽推送
  initPlatformState() {
    /// 开启DEBUG
    XgFlutterPlugin().setEnableDebug(false);

    /// 添加回调事件
    XgFlutterPlugin().addEventHandler(
      onRegisteredDeviceToken: (String msg) async {
        print("flutter onRegisteredDeviceToken: $msg");
      },
      onRegisteredDone: (String msg) async {
        String token = "";
        try {
          token = await XgFlutterPlugin.xgToken;
        } catch (e) {
          LogUtil.v("注册失败:${e.toString()}");
//          Utils.showToast("注册失败:${e.toString()}");
        }
        if (token == null || token.isEmpty) {
          LogUtil.v("注册失败:${xgCount.toString()}");
//          Utils.showToast("注册失败:${xgCount.toString()}");
          registerPush();
        } else {
          LogUtil.v("注册成功:$token");
//          Utils.showToast("注册成功:$token");
          userTokenInit(token);
          XgFlutterPlugin().setAppBadge(0);
        }
      },
      unRegistered: (String msg) async {
        print("flutter unRegistered: $msg");
      },
      onReceiveNotificationResponse: (Map<String, dynamic> msg) async {
        LogUtil.v("flutter onReceiveNotificationResponse $msg");
      },
      onReceiveMessage: (Map<String, dynamic> msg) async {
        print("flutter onReceiveMessage $msg");
      },
      xgPushDidSetBadge: (String msg) async {
        print("flutter xgPushDidSetBadge: $msg");
        /// 在此可设置应用角标
        XgFlutterPlugin().setAppBadge(0);
      },
      xgPushDidBindWithIdentifier: (String msg) async {
        print("flutter xgPushDidBindWithIdentifier: $msg");
      },
      xgPushDidUnbindWithIdentifier: (String msg) async {
        print("flutter xgPushDidUnbindWithIdentifier: $msg");
      },
      xgPushDidUpdatedBindedIdentifier: (String msg) async {
        print("flutter xgPushDidUpdatedBindedIdentifier: $msg");
      },
      xgPushDidClearAllIdentifiers: (String msg) async {
        print("flutter xgPushDidClearAllIdentifiers: $msg");
      },
      xgPushClickAction: (Map<String, dynamic> msg) async {
        if(Platform.isIOS&&msg!=null&&msg['custom']!=null){
          Map custom=json.decode(msg['custom'].toString());
          switch(custom["messageType"].toString()){
            case "10":
              NavigatorUtil.goHandleOnlinePage(
                  context, custom["rid"].toString(), custom['mid'].toString(),
                  fromNotify: true);
              break;
            case "11":
              NavigatorUtil.goNotebookDetailPage(
                  context, custom['rid'].toString(),mid:custom['mid'].toString(),
                  fromNotify: true);
              break;
          }
        }
      },
    );
    registerPush();
  }

  //注册信鸽
  registerPush() async {
    if (xgCount > 5) return;
    if (Platform.isAndroid) {
      /// 设置OPPO AppKey 和 AppSecret
      if (await XgFlutterPlugin().getXgAndroidApi().isOppoRom()) {
        XgFlutterPlugin().getXgAndroidApi().enableOppoNotification();
        XgFlutterPlugin().getXgAndroidApi().setOppoPushAppId(appId: "30260281");
        XgFlutterPlugin()
            .getXgAndroidApi()
            .setOppoPushAppKey(appKey: "9b7e372f93794593953f93f118619570");
      }
      // 设置小米 AppID 和 AppKey。
      if (await XgFlutterPlugin().getXgAndroidApi().isMiuiRom()) {
        XgFlutterPlugin()
            .getXgAndroidApi()
            .setMiPushAppId(appId: "2882303761518639456");
        XgFlutterPlugin()
            .getXgAndroidApi()
            .setMiPushAppKey(appKey: "5231863961456");
      }
      XgFlutterPlugin().getXgAndroidApi().enableOtherPush();
    }

    /// 启动TPNS服务
    LogUtil.v("register:${xgCount.toString()}");
    XgFlutterPlugin().startXg("1600012876", "INUIMFK21WGH");
    xgCount++;
  }

  //初始化推送token
  userTokenInit(String token) {
    UserModel userModel = Provider.of<UserModel>(context, listen: false);
    userModel.token = token;
    Map<String, String> params = {
      "sid": userModel.user.sellerid,
      "account": userModel.user.account,
      "user_token": Platform.isAndroid ? "Android_$token" : "Ios_$token"
    };
    userModel.userTokenInit(context, params);
  }

  //获取未处理在线预订消息
  getUntreatedMessage() {
    UserModel userModel = Provider.of<UserModel>(context, listen: false);
    Map<String, String> params = {
      "sid": userModel.user.sellerid,
      "type_id": "10", //10 在线预订
      "status": "0", //未处理
      "offset": "0",
      "limit": "100",
    };
    MessageDialogModel messageModel =
        Provider.of<MessageDialogModel>(context, listen: false);
    messageModel.getUntreatedMsg(context, params);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    // TODO: implement didChangeAppLifecycleState
    super.didChangeAppLifecycleState(state);
    switch (state) {
      case AppLifecycleState.resumed: //应用前台可见
//        getUntreatedMessage();
        break;
      case AppLifecycleState.inactive:
        print('inactive');
        break;
      case AppLifecycleState.paused:
    print('paused');
        break;
      case AppLifecycleState.detached:
        print('detached');
        break;

      default:
        break;
    }
  }

  // 系统窗口相关改变回调
  void didChangeMetrics() {
    super.didChangeMetrics();
    print('fffff');
  }

// // 系统亮度改变回调
//   void didChangePlatformBrightness() {
//     super.didChangePlatformBrightness();
//     print('fdddddd');
//   }

// // 文本缩放系数改变回调
//   void didChangeTextScaleFactor() {}

// // 内存不足警告回调
//   void didHaveMemoryPressure() {}

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        iconSize: ScreenUtil().setWidth(70),
        unselectedFontSize: ScreenUtil().setSp(22),
        selectedFontSize: ScreenUtil().setSp(22),
        backgroundColor: MyColours.color_ffffff,
        items: [
          BottomNavigationBarItem(
            icon: Image(
              image: AssetImage("assets/message_default.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            activeIcon: Image(
              image: AssetImage("assets/message_selected.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            title: Text(
              "消息中心",
              style: TextStyle(
                  color: _currIndex == 0 ? _activeColor : _defaultColor,
                  fontSize: ScreenUtil().setSp(22)),
            ),
          ),
          BottomNavigationBarItem(
            icon: Image(
              image: AssetImage("assets/notebook_default.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            activeIcon: Image(
              image: AssetImage("assets/notebook_selected.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            title: Text(
              "预定本",
              style: TextStyle(
                  color: _currIndex == 1 ? _activeColor : _defaultColor,
                  fontSize: ScreenUtil().setSp(22)),
            ),
          ),
          BottomNavigationBarItem(
            icon: Image(
              image: AssetImage("assets/my_default.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            activeIcon: Image(
              image: AssetImage("assets/my_selected.png"),
              width: ScreenUtil().setWidth(70),
              height: ScreenUtil().setWidth(70),
            ),
            title: Text(
              "我的",
              style: TextStyle(
                  color: _currIndex == 2 ? _activeColor : _defaultColor,
                  fontSize: ScreenUtil().setSp(22)),
            ),
          ),
        ],
        type: BottomNavigationBarType.fixed,
        currentIndex: _currIndex,
        onTap: (int index) {
          if (_currIndex != index) {
            setState(() {
              _currIndex = index;
            });
            if (_currIndex == 2) {
              Utils.changeStatusColor(color: MyColours.color_2bb5b7);
            } else {
              Utils.changeStatusColor(color: MyColours.color_ffffff);
            }
          }
        },
      ),
      body: SafeArea(child: pages[_currIndex]),
    );
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    LogUtil.v("home_dispose");
    if (timer != null) {
      timer.cancel();
    }
    WidgetsBinding.instance.removeObserver(this);
  }
}