page_stack.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:app_flowy/workspace/domain/page_stack/page_stack_bloc.dart';
  2. import 'package:equatable/equatable.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:app_flowy/workspace/presentation/widgets/blank_page.dart';
  6. import 'package:app_flowy/workspace/presentation/widgets/fading_index_stack.dart';
  7. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. List<ViewType> pages = ViewType.values.toList();
  10. abstract class HomeStackContext extends Equatable {
  11. final ViewType type;
  12. final String title;
  13. const HomeStackContext({required this.type, required this.title});
  14. }
  15. class HomePageStack {
  16. final PageStackBloc _bloc = PageStackBloc();
  17. HomePageStack();
  18. String title() {
  19. return _bloc.state.pageContext.title;
  20. }
  21. void setPageContext(HomeStackContext? newContext) {
  22. _bloc.add(PageStackEvent.setContext(newContext ?? BlankPageContext()));
  23. }
  24. Widget stackTopBar() {
  25. return BlocProvider<PageStackBloc>(
  26. create: (context) => _bloc,
  27. child: BlocBuilder<PageStackBloc, PageStackState>(
  28. builder: (context, state) {
  29. return HomeTopBar(
  30. title: state.pageContext.title,
  31. );
  32. },
  33. ),
  34. );
  35. }
  36. Widget stackWidget() {
  37. return BlocProvider<PageStackBloc>(
  38. create: (context) => _bloc,
  39. child: BlocBuilder<PageStackBloc, PageStackState>(
  40. builder: (context, state) {
  41. final pageContext = state.pageContext;
  42. return FadingIndexedStack(
  43. index: pages.indexOf(pageContext.type),
  44. children: buildPagesWidget(pageContext),
  45. );
  46. },
  47. ),
  48. );
  49. }
  50. }
  51. List<Widget> buildPagesWidget(HomeStackContext pageContext) {
  52. return ViewType.values.map((viewType) {
  53. if (viewType == pageContext.type) {
  54. return viewType.builderDisplayWidget(pageContext);
  55. } else {
  56. return const BlankPage(context: BlankPageContext());
  57. }
  58. }).toList();
  59. }
  60. extension PageTypeExtension on ViewType {
  61. HomeStackWidget builderDisplayWidget(HomeStackContext context) {
  62. switch (this) {
  63. case ViewType.Blank:
  64. return BlankPage(context: context as BlankPageContext);
  65. case ViewType.Doc:
  66. return BlankPage(context: context as BlankPageContext);
  67. default:
  68. return BlankPage(context: context as BlankPageContext);
  69. }
  70. }
  71. }
  72. abstract class HomeStackWidget extends StatefulWidget {
  73. final HomeStackContext pageContext;
  74. const HomeStackWidget({Key? key, required this.pageContext})
  75. : super(key: key);
  76. }