home_page.dart 5.26 KB
import 'package:flutter/material.dart';
import 'package:one_poem/account/page/account_page.dart';
import 'package:one_poem/category/page/categories_page.dart';
import 'package:one_poem/poem/page/poem_page.dart';
import 'package:one_poem/res/resources.dart';
import 'package:one_poem/timeline/pages/timelines_page.dart';
import 'package:one_poem/util/theme_utils.dart';
import 'package:one_poem/widgets/double_tap_back_exit_app.dart';
import 'package:one_poem/widgets/load_image.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/one_poem_localizations.dart';
import 'provider/home_provider.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> with RestorationMixin {
  static const double _imageSize = 25.0;

  late List<Widget> _pageList;
  final PageController _pageController = PageController();

  HomeProvider provider = HomeProvider();

  List<BottomNavigationBarItem>? _list;

  @override
  void initState() {
    super.initState();
    initData();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  void initData() {
    _pageList = [
      const PoemPage(),
      const TimelinesPage(),
      const CategoriesPage(),
      const AccountPage(),
    ];
  }

  List<BottomNavigationBarItem> _buildBottomNavigationBarItem(
      BuildContext context) {
    final bool isDark = context.isDark;
    List<String> _appBarTitles = [
      OnePoemLocalizations.of(context).onePoemBottomNavigationBarItemTitle,
      OnePoemLocalizations.of(context).timelineBottomNavigationBarItemTitle,
      OnePoemLocalizations.of(context).categoryBottomNavigationBarItemTitle,
      OnePoemLocalizations.of(context).profileBottomNavigationBarItemTitle,
    ];
    if (_list == null) {
      List<List<Icon>> _tabImages;
      if (!isDark) {
        _tabImages = [
          [
            const Icon(
              Icons.stream,
            ),
            const Icon(
              Icons.stream_outlined,
            ),
          ],
          [
            const Icon(
              Icons.self_improvement_outlined,
            ),
            const Icon(
              Icons.self_improvement_outlined,
            ),
          ],[
            const Icon(
              Icons.groups,
            ),
            const Icon(
              Icons.groups_outlined,
            ),
          ],[
            const Icon(
              Icons.perm_identity,
            ),
            const Icon(
              Icons.perm_identity_outlined,
            ),
          ],
        ];
      } else {
        _tabImages = [
          [
            const Icon(
              Icons.stream,
            ),
            const Icon(
              Icons.stream_outlined,
            ),
          ],
          [
            const Icon(
              Icons.self_improvement_outlined,
            ),
            const Icon(
              Icons.self_improvement_outlined,
            ),
          ],[
            const Icon(
              Icons.groups,
            ),
            const Icon(
              Icons.groups_outlined,
            ),
          ],[
            const Icon(
              Icons.perm_identity,
            ),
            const Icon(
              Icons.perm_identity_outlined,
            ),
          ],
        ];
      }
      _list = List.generate(_tabImages.length, (i) {
        return BottomNavigationBarItem(
          icon: _tabImages[i][0],
          activeIcon: _tabImages[i][1],
          label: _appBarTitles[i],
        );
      });
    }
    return _list!;
  }

  @override
  Widget build(BuildContext context) {
    final bool isDark = context.isDark;
    return ChangeNotifierProvider<HomeProvider>(
      create: (_) => provider,
      child: DoubleTapBackExitApp(
        child: Scaffold(
            bottomNavigationBar: Consumer<HomeProvider>(
              builder: (_, provider, __) {
                return BottomNavigationBar(
                  backgroundColor: context.backgroundColor,
                  items: _buildBottomNavigationBarItem(context),
                  type: BottomNavigationBarType.fixed,
                  currentIndex: provider.value,
                  elevation: 5.0,
                  iconSize: 21.0,
                  selectedFontSize: Dimens.font_sp10,
                  unselectedFontSize: Dimens.font_sp10,
                  selectedItemColor: Theme.of(context).primaryColor,
                  unselectedItemColor: isDark
                      ? Colours.dark_unselected_item_color
                      : Colours.unselected_item_color,
                  onTap: (index) => _pageController.jumpToPage(index),
                );
              },
            ),
            // 使用PageView的原因参看 https://zhuanlan.zhihu.com/p/58582876
            body: PageView(
              physics: const NeverScrollableScrollPhysics(), // 禁止滑动
              controller: _pageController,
              onPageChanged: (int index) => provider.value = index,
              children: _pageList,
            )),
      ),
    );
  }

  @override
  String? get restorationId => 'home';

  @override
  void restoreState(RestorationBucket? oldBucket, bool initialRestore) {
    registerForRestoration(provider, 'BottomNavigationBarCurrentIndex');
  }
}