chatapp3-flutter/lib/modules/home/index_home_page.dart
2026-04-09 21:32:23 +08:00

213 lines
7.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
import 'package:yumi/modules/index/main_route.dart';
import 'package:yumi/services/auth/user_profile_manager.dart';
import 'package:provider/provider.dart';
import 'package:yumi/app/routes/sc_fluro_navigator.dart';
import 'package:yumi/ui_kit/theme/socialchat_theme.dart';
import 'package:yumi/ui_kit/widgets/countdown_timer.dart';
///Home页面
class SCIndexHomePage extends StatefulWidget {
@override
_SCIndexHomePageState createState() => _SCIndexHomePageState();
}
class _SCIndexHomePageState extends State<SCIndexHomePage>
with TickerProviderStateMixin {
TabController? _tabController;
final List<Widget> _pages = [];
final List<Widget> _tabs = [];
bool refresh = false; // 👈 改为 false初始显示加载
@override
void initState() {
super.initState();
// 在构建完成后加载数据
WidgetsBinding.instance.addPostFrameCallback((_) {
_updateTabs();
});
}
void _updateTabs() {
_tabController?.dispose();
_pages.clear();
final strategy = SCGlobalConfig.businessLogicStrategy;
_pages.addAll(strategy.getHomeTabPages(context));
_tabController = TabController(
length: _pages.length,
vsync: this,
initialIndex: strategy.getHomeInitialTabIndex(),
);
// 可选:监听切换事件
_tabController?.addListener(() {});
// 数据更新完成后,刷新界面
if (mounted) {
setState(() {
refresh = true;
});
}
}
@override
void dispose() {
_tabController?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
// 如果数据未准备好,显示加载指示器
if (!refresh || _tabController == null || _pages.isEmpty) {
return Center(
child: Container(
decoration: BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.circular(8),
),
width: 55.w,
height: 55.w,
child: const CupertinoActivityIndicator(),
),
);
}
// 正常渲染界面
_tabs.clear();
final strategy = SCGlobalConfig.businessLogicStrategy;
_tabs.addAll(strategy.getHomeTabLabels(context));
return Stack(
children: [
Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent,
body: Column(
children: [
// 自定义顶部栏(包含状态栏和 TabBar
SafeArea(
child: Row(
children: [
// TabBar 直接放在这里
Expanded(
child: TabBar(
tabAlignment: TabAlignment.start,
isScrollable: true,
splashFactory: NoSplash.splashFactory,
overlayColor: MaterialStateProperty.all(
Colors.transparent,
),
indicator: const BoxDecoration(),
labelStyle: TextStyle(
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic,
fontSize: 19.sp,
color:SocialChatTheme.primaryLight,
),
unselectedLabelStyle: TextStyle(
fontWeight: FontWeight.normal,
fontSize: 14.sp,
color: Colors.white
),
indicatorColor: Colors.transparent,
dividerColor: Colors.transparent,
controller: _tabController,
tabs: _tabs,
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
icon: Image.asset(
"sc_images/index/sc_icon_serach.png",
width: 25.w,
height: 25.w,
),
onPressed:
() => SCNavigatorUtils.push(
context,
SCMainRoute.mainSearch,
),
),
],
),
),
],
),
),
// TabBarView 直接作为剩余空间
Expanded(
child: TabBarView(controller: _tabController, children: _pages),
),
],
),
),
Consumer<SocialChatUserProfileManager>(
builder: (context, ref, child) {
if (SCGlobalConfig.isReview) return Container();
final strategy = SCGlobalConfig.businessLogicStrategy;
if (strategy.shouldShowFirstRechargePrompt()) {
final position = strategy.getFirstRechargePosition();
return PositionedDirectional(
top: position['top'],
bottom: position['bottom'],
start: position['start'],
end: position['end'],
child: GestureDetector(
child: Column(
children: [
Image.asset(
"sc_images/index/sc_icon_first_recharge_tag.webp",
height: 70.w,
),
Transform.translate(
offset: Offset(0, -10),
child: Container(
height: 23.w,
width: 100.w,
alignment: AlignmentDirectional.center,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"sc_images/index/sc_icon_first_recharge_btn.png",
),
fit: BoxFit.fill,
),
),
child: CountdownTimer(
expiryDate: DateTime.fromMillisecondsSinceEpoch(
AccountStorage()
.getCurrentUser()
?.userProfile
?.firstRechargeEndTime ??
0,
),
color: Colors.white,
),
),
),
],
),
onTap: () {
strategy.onFirstRechargeTap(context);
},
),
);
}
return Container();
},
),
],
);
}
}