import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_boost/flutter_boost.dart'; import '../../api/video_api.dart'; import '../../ui/widget/button.dart'; import '../../ui/widget/video_item.dart'; import '../../utils/db_manager.dart'; import '../../utils/jump_page.dart'; import '../../utils/string_util.dart'; import '../../utils/ui_constant.dart'; import '../../utils/user_util.dart'; import 'model/user/user_info.dart'; import 'model/video/watch_record_model.dart'; import 'utils/share_preference.dart'; import 'package:share_plus/share_plus.dart'; class MinePage extends StatefulWidget { MinePage({Key? key, required this.title}) : super(key: key); final String title; @override _MinePageState createState() => _MinePageState(); } class _MinePageState extends State with SingleTickerProviderStateMixin, PageVisibilityObserver { int index = 1; UserInfo? _user; List recordList = []; int collectedVideoCount = 0; int favoriteVideoCount = 0; String applink = ""; @override void initState() { super.initState(); if (Platform.isIOS) { MySharedPreferences.getInstance().getString("appLink").then((value) { setState(() { applink = value!; }); }); } _refreshData(); } void _refreshData() { updateUserInfo(); loadWatchRecord(); loadUserVideoCount(); } void updateUserInfo() async { if (!await UserUtil.isLogin()) { setState(() { _user = null; }); return; } UserUtil.updateUserInfo(context).then((value) { print("user:$value"); setState(() { _user = value; }); }); } void loadWatchRecord() async { List temp = await DBManager.listWatchRecord(1, 20); setState(() { recordList = temp; }); } void loadUserVideoCount() async { if (!await UserUtil.isLogin()) { return; } Map? result = await VideoApiUtil.getUserVideoCount(context); if (result == null) { return; } if (result["IsPost"] == "true") { setState(() { collectedVideoCount = result["Data"]["collectionCount"]; favoriteVideoCount = result["Data"]["attentionCount"]; }); } } void jumpPage(String name, {Map? params}) { JumpPageUtil.jumpPage(name, context, native: Platform.isIOS,params: params, callback: (data) { _refreshData(); }); } @override void didChangeDependencies() { super.didChangeDependencies(); ///注册监听器 PageVisibilityBinding.instance.addObserver(this, ModalRoute.of(context)!); } @override void dispose() { ///移除监听器 PageVisibilityBinding.instance.removeObserver(this); super.dispose(); } @override void onBackground() { super.onBackground(); print("LifecycleTestPage - onBackground"); } @override void onForeground() { super.onForeground(); print("LifecycleTestPage - onForeground"); } @override void onPageHide() { super.onPageHide(); print("LifecycleTestPage - onPageHide"); } @override void onPageShow() { super.onPageShow(); print("LifecycleTestPage - onPageShow"); _refreshData(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ Container( alignment: Alignment.center, padding: EdgeInsets.only( top: 15 + MediaQuery.of(context).viewPadding.top, bottom: 15), color: ColorConstant.theme, child: const Text("我的", style: TextStyle(fontSize: 20, color: Colors.white)), ), Expanded( child: Container( height: 20, color: Colors.white, child: SingleChildScrollView( child: Column( children: [ Container( height: 51, ), //个人信息 InkWell( child: Row( children: [ Container( width: 18, ), portraitWidget(), Container( width: 10, ), _user != null ? personInfoWidget() : //登录框 loginBtnWidget(), Container( width: 18, ), ], ), onTap: () { UserUtil.isLogin().then((value) { if (value) { jumpPage("PersonInfoPage"); } }); }, ), Container( height: 8, ), //签名 signWidget(), Container( height: 23, ), //收藏,追剧,缓存 Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ InkWell( onTap: () { UserUtil.isLogin().then((value) { if (!value) { jumpPage("EmailLoginPage"); return; } jumpPage("VideoCollectedPage"); }); }, child: Column( children: [ const Text( "收藏", style: TextStyle( fontSize: 18, color: Color(0xFF888888)), ), Text( "$collectedVideoCount", style: const TextStyle( fontSize: 12, color: Color(0xFF888888)), ), ], )), InkWell( onTap: () { UserUtil.isLogin().then((value) { if (!value) { jumpPage("EmailLoginPage"); return; } jumpPage("VideoAttentionPage"); }); }, child: Column( children: [ const Text( "追剧", style: TextStyle( fontSize: 18, color: Color(0xFF888888)), ), Text( "$favoriteVideoCount", style: const TextStyle( fontSize: 12, color: Color(0xFF888888)), ), ], ), ), InkWell( onTap: () { jumpPage("VideoDownloadPage"); }, child: Column( children: const [ Text( "缓存", style: TextStyle( fontSize: 18, color: Color(0xFF888888)), ), Text( "0", style: TextStyle( fontSize: 12, color: Color(0xFF888888)), ), ], )), ], ), //历史记录 Container( height: 20, ), recordList.isNotEmpty ? Column( children: [ //title InkWell( onTap: () { jumpPage("VideoScanRecordPage"); }, child: Row( children: [ Container( width: 16, ), const Text( "历史记录", style: TextStyle( color: Color(0xFFAAAAAA), fontSize: 15), ), Expanded(child: Container()), const Text( "全部", style: TextStyle( color: Color(0xFFAAAAAA), fontSize: 15), ), Container( width: 6, ), Image.asset( "assets/imgs/icon_mine_fun_input.png", width: 6.5, ), Container( width: 16, ), ], )), //内容 Container( margin: const EdgeInsets.only(top: 15), height: 270, child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: Container( constraints: BoxConstraints( minWidth: MediaQuery.of(context) .size .width), alignment: Alignment.centerLeft, child: Wrap( direction: Axis.vertical, alignment: WrapAlignment.start, spacing: 10, runSpacing: 10, children: getRecordListWidget()))), ) ], ) : Container(), //功能 Container( margin: const EdgeInsets.fromLTRB(16, 23, 16, 16), padding: const EdgeInsets.fromLTRB(24, 10, 24, 10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12.5), border: Border.all( color: const Color(0xFFDDDDDD), width: 1)), child: Column( children: [ functionWidget( "assets/imgs/icon_mine_fun_share.png", "分享APP", 16, () { Share.share("海量韩剧,尽在应用:$applink"); }), functionWidget("assets/imgs/icon_mine_fun_privacy.png", "隐私政策", 13.5, () { jumpPage("BrowserPage", params: {"url": Constant.PRIVACY_URL,"title":"隐私政策"}); }), functionWidget("assets/imgs/icon_mine_fun_feedback.png", "反馈吐槽", 13.5, () { jumpPage("AdvicePage"); }), functionWidget("assets/imgs/icon_mine_fun_about_us.png", "关于我们", 17, () { MySharedPreferences.getInstance() .getString("aboutUsLink") .then((value) { if (!StringUtil.isNullOrEmpty(value)) { jumpPage("AboutUsPage"); } }); }), functionWidget("assets/imgs/icon_mine_fun_settings.png", "设置", 17.5, () { jumpPage("SettingPage"); }), ], ), ) ], )), )) ], )); } List getRecordListWidget() { List list = recordList.map((e) { //是否为主分类 List mainTypes = [150, 151, 152, 153]; if (mainTypes.contains(e.video!.videoType!.id!)) { return InkWell( child: getBigRecordItem(e), onTap: () { jumpVideoDetail(context, e.video, Platform.isIOS, position: e.position!); }, ); } else { return InkWell( child: getSmallRecordItem(e), onTap: () { jumpVideoDetail(context, e.video, Platform.isIOS, position: e.position!); }, ); } }).toList(); list.insert( 0, InkWell( child: Container( width: 5, height: 270, ))); list.add(InkWell( child: Container( width: 5, height: 270, ))); return list; } Widget getSmallRecordItem(WatchRecordModel record) { return Container( height: 130, child: Stack( children: [ Container( margin: const EdgeInsets.only(top: 20), height: 110, width: 120 * 1.4, decoration: BoxDecoration( color: Colors.black38, borderRadius: BorderRadius.circular(10)), ), Container( alignment: Alignment.center, width: 120 * 1.4, padding: const EdgeInsets.only(left: 10, right: 10), child: Column( children: [ ClipRRect( borderRadius: BorderRadius.circular(10), child: SizedBox( height: 100, width: 120 * 1.4 - 20, child: VideoImage(record.video!.picture), ), ), Container( height: 5, ), Text( record.video!.name!, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(color: Colors.white), ) ], )) ], )); } Widget getBigRecordItem(WatchRecordModel record) { return Stack( children: [ Container( margin: const EdgeInsets.only(top: 20), height: 250, width: 150, decoration: BoxDecoration( color: Colors.black38, borderRadius: BorderRadius.circular(10)), ), Container( alignment: Alignment.center, width: 150, padding: EdgeInsets.only(left: 10, right: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(10), child: Container( height: 200, child: VideoImage( record.video!.vpicture ?? record.video!.picture), ), ), Container( height: 5, ), Text( record.video!.name!, maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(color: Colors.white), ) ], )) ], ); } Widget portraitWidget() { return Container( width: 80, height: 80, padding: const EdgeInsets.all(2), alignment: Alignment.center, decoration: BoxDecoration( color: const Color(0xFFAAAAAA), borderRadius: BorderRadius.circular(40)), child: ClipRRect( borderRadius: BorderRadius.circular(40), child: CommonImage( _user == null ? "assets/imgs/ic_portrait_default.png" : _user!.portrait!, defaultWidget: Image.asset("assets/imgs/ic_portrait_default.png")), )); } Widget loginBtnWidget() { return MyFillButton( "立即登录", 12.5, width: 138, fontSize: 14, onClick: () { jumpPage("EmailLoginPage"); }, ); } Widget personInfoWidget() { return Column( children: [ Text(_user!.nickname!, maxLines: 1, style: const TextStyle( fontSize: 18, color: ColorConstant.theme, )), Container( height: 6, ), Text("ID:${_user!.id!}", style: const TextStyle( fontSize: 15, color: Color(0xFFA9A9A9), )), ], ); } Widget signWidget() { return Container( padding: const EdgeInsets.only(top: 21.5, left: 12.5, right: 12.5), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ ColorConstant.theme.withAlpha(0), ColorConstant.theme.withAlpha(108), ], ), ), child: Container( height: 64, padding: const EdgeInsets.only(left: 23, right: 23), alignment: Alignment.centerLeft, decoration: const BoxDecoration( color: ColorConstant.theme, borderRadius: BorderRadius.only( topLeft: Radius.circular(15), topRight: Radius.circular(15))), child: Text( "个性签名:${(_user == null || _user!.sign == null || _user!.sign!.isEmpty) ? "这个人非常有趣,但是什么也没写~" : _user!.sign}", maxLines: 3, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: 12, color: Colors.white), ), ), ); } Widget functionWidget( String icon, String text, double width, GestureTapCallback click) { return InkWell( onTap: () { click(); }, child: Container( padding: const EdgeInsets.only(top: 15, bottom: 15), child: Row( children: [ Container( width: 20, alignment: Alignment.center, child: Image.asset( icon, width: width, )), Container( width: 10, ), Text( text, style: const TextStyle(color: Color(0xFFAAAAAA), fontSize: 15), ), Expanded(child: Container()), Image.asset( "assets/imgs/icon_mine_fun_input.png", width: 6.5, ), ], )), ); } }