home_page.dart 2.27 KB
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../../app_review_prompt/logic/app_review_prompt_logic.dart';
import '../../../../data/local/local_storage.dart';
import '../../../../core/services/user_state_service.dart';
import '../controllers/home_controller.dart';
import '../widgets/df_tab_bar.dart';
import '../../friends/views/friends_tab.dart';
import 'tabs/home_trend_view.dart';
import 'tabs/today_tab.dart';
import 'tabs/my_tab.dart';

class HomePage extends GetView<HomeController> {
  const HomePage({super.key});

  static const _tabs = [
    TodayTab(),
    HomeTrendView(),
    FriendsTab(),
    MyTab(),
  ];

  @override
  Widget build(BuildContext context) {
    return _HomeReviewPromptGate(
      controller: controller,
      child: Scaffold(
        // 不使用系统 AppBar,Today 页自带状态栏适配
        extendBody: true, // 让内容延伸到 bottomNavigationBar 下方
        extendBodyBehindAppBar: true,

        body: Obx(
          () => IndexedStack(
            index: controller.selectedIndex.value,
            children: _tabs,
          ),
        ),
        bottomNavigationBar: Obx(
          () => DfTabBar(
            selectedIndex: controller.selectedIndex.value,
            onTap: (index) => controller.changeTab(index),
          ),
        ),
      ),
    );
  }
}

class _HomeReviewPromptGate extends StatefulWidget {
  const _HomeReviewPromptGate({
    required this.controller,
    required this.child,
  });

  final HomeController controller;
  final Widget child;

  @override
  State<_HomeReviewPromptGate> createState() => _HomeReviewPromptGateState();
}

class _HomeReviewPromptGateState extends State<_HomeReviewPromptGate> {
  late final AppReviewPromptLogic _appReviewPromptLogic;

  @override
  void initState() {
    super.initState();
    _appReviewPromptLogic = AppReviewPromptLogic(
      storage: Get.find<LocalStorage>(),
      userIdProvider: () => Get.find<UserStateService>().userId,
    );

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      if (!mounted) return;
      await widget.controller.maybeShowMembershipOffer();
      if (!mounted) return;
      await _appReviewPromptLogic.maybeShowPendingPrompt(context);
    });
  }

  @override
  Widget build(BuildContext context) => widget.child;
}