home_screen.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import 'package:app_flowy/workspace/application/home/home_bloc.dart';
  2. import 'package:app_flowy/workspace/application/home/home_watcher_bloc.dart';
  3. import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
  4. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  5. import 'package:app_flowy/startup/startup.dart';
  6. import 'package:flowy_infra/flowy_logger.dart';
  7. import 'package:flowy_infra_ui/style_widget/container.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. import 'package:styled_widget/styled_widget.dart';
  12. import 'home_layout.dart';
  13. class HomeScreen extends StatelessWidget {
  14. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  15. final UserDetail user;
  16. const HomeScreen(this.user, {Key? key}) : super(key: key);
  17. @override
  18. Widget build(BuildContext context) {
  19. return MultiBlocProvider(
  20. providers: [
  21. BlocProvider<HomeWatcherBloc>(
  22. create: (context) => getIt<HomeWatcherBloc>()),
  23. BlocProvider<HomeBloc>(create: (context) => getIt<HomeBloc>()),
  24. ],
  25. child: Scaffold(
  26. key: HomeScreen.scaffoldKey,
  27. body: BlocBuilder<HomeBloc, HomeState>(
  28. buildWhen: (previous, current) => previous != current,
  29. builder: (context, state) {
  30. return FlowyContainer(
  31. Theme.of(context).colorScheme.surface,
  32. // Colors.white,
  33. child: _buildBody(
  34. state, context.read<HomeBloc>().state.forceCollapse),
  35. );
  36. },
  37. ),
  38. ),
  39. );
  40. }
  41. Widget _buildBody(HomeState state, bool forceCollapse) {
  42. return LayoutBuilder(
  43. builder: (BuildContext context, BoxConstraints constraints) {
  44. final layout = HomeLayout(context, constraints, forceCollapse);
  45. const homePage = HomePage();
  46. final menu = _buildHomeMenu(
  47. layout: layout,
  48. context: context,
  49. );
  50. final editPannel = _buildEditPannel(
  51. homeState: state,
  52. layout: layout,
  53. context: context,
  54. );
  55. return _layoutWidgets(
  56. layout: layout,
  57. homePage: homePage,
  58. homeMenu: menu,
  59. editPannel: editPannel);
  60. },
  61. );
  62. }
  63. Widget _buildHomeMenu(
  64. {required HomeLayout layout, required BuildContext context}) {
  65. final homeBloc = context.read<HomeBloc>();
  66. Widget homeMenu = HomeMenu(
  67. pageContextChanged: (pageContext) {
  68. getIt<HomePageStack>().setStackView(pageContext);
  69. },
  70. isCollapseChanged: (isCollapse) {
  71. homeBloc.add(HomeEvent.forceCollapse(isCollapse));
  72. },
  73. user: user,
  74. );
  75. homeMenu = RepaintBoundary(child: homeMenu);
  76. homeMenu = FocusTraversalGroup(child: homeMenu);
  77. return homeMenu;
  78. }
  79. Widget _buildEditPannel(
  80. {required HomeState homeState,
  81. required BuildContext context,
  82. required HomeLayout layout}) {
  83. final homeBloc = context.read<HomeBloc>();
  84. Widget editPannel = EditPannel(
  85. context: homeState.editContext,
  86. onEndEdit: () => homeBloc.add(const HomeEvent.dismissEditPannel()),
  87. );
  88. // editPannel = RepaintBoundary(child: editPannel);
  89. // editPannel = FocusTraversalGroup(child: editPannel);
  90. return editPannel;
  91. }
  92. Widget _layoutWidgets(
  93. {required HomeLayout layout,
  94. required Widget homeMenu,
  95. required Widget homePage,
  96. required Widget editPannel}) {
  97. return Stack(
  98. children: [
  99. homeMenu
  100. .animatedPanelX(
  101. closeX: -layout.menuWidth,
  102. isClosed: !layout.showMenu,
  103. )
  104. .positioned(
  105. left: 0,
  106. top: 0,
  107. width: layout.menuWidth,
  108. bottom: 0,
  109. animate: true)
  110. .animate(layout.animDuration, Curves.easeOut),
  111. homePage
  112. .constrained(minWidth: 500)
  113. .positioned(
  114. left: layout.homePageLOffset,
  115. right: layout.homePageROffset,
  116. bottom: 0,
  117. top: 0,
  118. animate: true)
  119. .animate(layout.animDuration, Curves.easeOut),
  120. editPannel
  121. .animatedPanelX(
  122. duration: layout.animDuration.inMilliseconds * 0.001,
  123. closeX: layout.editPannelWidth,
  124. isClosed: !layout.showEditPannel,
  125. )
  126. .positioned(
  127. right: 0, top: 0, bottom: 0, width: layout.editPannelWidth),
  128. ],
  129. );
  130. }
  131. }
  132. class HomePage extends StatelessWidget {
  133. static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
  134. // final Size size;
  135. const HomePage({Key? key}) : super(key: key);
  136. @override
  137. Widget build(BuildContext context) {
  138. Log.info('HomePage build');
  139. return Column(
  140. mainAxisAlignment: MainAxisAlignment.start,
  141. children: [
  142. getIt<HomePageStack>().stackTopBar(),
  143. Expanded(
  144. child: Container(
  145. color: Colors.white,
  146. child: FocusTraversalGroup(
  147. child: getIt<HomePageStack>().stackWidget(),
  148. ),
  149. ),
  150. ),
  151. ],
  152. );
  153. }
  154. }
  155. // class HomeIndexStack extends StatelessWidget {
  156. // const HomeIndexStack({Key? key}) : super(key: key);
  157. // @override
  158. // Widget build(BuildContext context) {
  159. // return BlocBuilder<HomeBloc, HomeState>(
  160. // buildWhen: (p, c) {
  161. // if (p.pageContext != c.pageContext) {
  162. // Log.info(
  163. // 'PageContext switch from ${p.pageContext.pageType} to ${c.pageContext.pageType}');
  164. // }
  165. // return p.pageContext != c.pageContext;
  166. // },
  167. // builder: (context, state) {
  168. // final pageContext = context.read<HomeBloc>().state.pageContext;
  169. // return Expanded(
  170. // child: Container(
  171. // color: Colors.white,
  172. // child: FocusTraversalGroup(
  173. // child: getIt<FlowyHomeIndexStack>().indexStack(pageContext),
  174. // ),
  175. // ),
  176. // );
  177. // },
  178. // );
  179. // }
  180. // }