home_page.dart 4.23 KB
import 'package:flutter/material.dart';
import 'package:one_poem/account/page/account_page.dart';
import 'package:one_poem/poem/page/poem_page.dart';
import 'package:one_poem/widgets/double_tap_back_exit_app.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 {
  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 AccountPage(),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<HomeProvider>(
      create: (_) => provider,
      child: DoubleTapBackExitApp(
        child: Scaffold(
          floatingActionButton: FloatingActionButton(
            onPressed: () {},
            tooltip: "发一言",
            backgroundColor: Colors.white,
            child: const Icon(
              Icons.add,
              color: Colors.black45,
            ),
          ),
          floatingActionButtonLocation:
              FloatingActionButtonLocation.centerDocked,
          bottomNavigationBar: Consumer<HomeProvider>(
            builder: (_, provider, __) {
              return BottomAppBar(
                color: Colors.black45,
                shape: const CircularNotchedRectangle(),
                child: Row(
                    mainAxisSize: MainAxisSize.max,
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    children: <Widget>[
                      InkWell(
                        onTap: () {
                          _pageController.animateToPage(0,
                              duration: const Duration(milliseconds: 100), curve: Curves.easeOutSine);
                        },
                        child: Container(
                          alignment: Alignment.center,
                          height: 36.0,
                          child: Text(
                            OnePoemLocalizations.of(context)
                                .onePoemBottomNavigationBarItemTitle,
                            style: const TextStyle(
                              color: Colors.white54,
                              fontSize: 15.0,
                            ),
                          ),
                        ),
                      ),
                      InkWell(
                        onTap: () {
                          _pageController.animateToPage(1,
                              duration: const Duration(milliseconds: 100), curve: Curves.easeOutSine);
                        },
                        child: Container(
                          alignment: Alignment.center,
                          height: 36.0,
                          child: Text(
                            OnePoemLocalizations.of(context)
                                .profileBottomNavigationBarItemTitle,
                            style: const TextStyle(
                              color: Colors.white54,
                              fontSize: 15.0,
                            ),
                          ),
                        ),
                      ),
                    ]),
                elevation: 5.0,
              );
            },
          ),
          // 使用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');
  }
}