home_page.dart 6.03 KB
import 'package:Parlando/events/trans_event.dart';
import 'package:Parlando/poem/poem_router.dart';
import 'package:Parlando/routers/fluro_navigator.dart';
import 'package:Parlando/widgets/radial/flutter_radial_menu.dart';
import 'package:flutter/material.dart';
import 'package:Parlando/account/page/account_page.dart';
import 'package:Parlando/poem/page/poem_page.dart';
import 'package:Parlando/widgets/double_tap_back_exit_app.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/Parlando_localizations.dart';
import 'provider/home_provider.dart';

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

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

enum MenuOptions {
  audio,
  video,
}

class _HomeState extends State<Home> with RestorationMixin {
  late List<Widget> _pageList;
  final PageController _pageController = PageController();

  HomeProvider provider = HomeProvider();
  final GlobalKey<RadialMenuState> _menuKey = GlobalKey<RadialMenuState>();
  final List<RadialMenuItem<MenuOptions>> items = <RadialMenuItem<MenuOptions>>[
    const RadialMenuItem<MenuOptions>(
      tooltip: 'audio',
      value: MenuOptions.audio,
      child: Icon(
        Icons.mic_none_outlined,
      ),
      iconColor: Colors.white,
      backgroundColor: Colors.blue,
    ),
    const RadialMenuItem<MenuOptions>(
      tooltip: "video",
      value: MenuOptions.video,
      child: Icon(
        Icons.video_call_outlined,
      ),
      iconColor: Colors.white,
      backgroundColor: Colors.green,
    ),
  ];

  void _onItemSelected(MenuOptions value) {
    if (value == MenuOptions.video) {
      NavigatorUtils.push(
        context,
        '${PoemRouter.poemRecordAudioPage}?id=100',
      );
    } else if (value == MenuOptions.audio) {
      NavigatorUtils.push(
        context,
        '${PoemRouter.poemRecordVideoPage}?data=100',
      );
    }
  }

  @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: () {
              eventBus.fire(TransEvent());
              NavigatorUtils.push(
                context,
                '${PoemRouter.poemRecordVideoPage}?data=100',
              );
            },
            tooltip: "发一言",
            backgroundColor: Colors.white,
            child: const Icon(
              Icons.video_call_outlined,
              color: Colors.black45,
            ),
          ),
          // floatingActionButton: SizedBox(
          //   height: 60,
          //   child: RadialMenu(
          //     key: _menuKey,
          //     items: items,
          //     radius: 80.0,
          //     onSelected: _onItemSelected,
          //       progressAnimationDuration:const Duration(milliseconds: 1),
          //   ),
          // ),
          floatingActionButtonLocation:
              FloatingActionButtonLocation.centerDocked,
          bottomNavigationBar: Consumer<HomeProvider>(
            builder: (_, provider, __) {
              return BottomAppBar(
                color: Colors.black45,
                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(
                            ParlandoLocalizations.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(
                            ParlandoLocalizations.of(context)
                                .profileBottomNavigationBarItemTitle,
                            style: const TextStyle(
                              color: Colors.white54,
                              fontSize: 15.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');
  }
}