page_stack.dart 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import 'package:app_flowy/workspace/domain/page_stack/page_stack_bloc.dart';
  2. import 'package:app_flowy/workspace/presentation/doc/doc_page.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:app_flowy/workspace/presentation/widgets/blank_page.dart';
  7. import 'package:app_flowy/workspace/presentation/widgets/fading_index_stack.dart';
  8. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  9. import 'package:flutter_bloc/flutter_bloc.dart';
  10. abstract class HomeStackView extends Equatable {
  11. final ViewType type;
  12. final String title;
  13. const HomeStackView({required this.type, required this.title});
  14. }
  15. // HomePageStack is initialized as singleton to controll the page stack.
  16. class HomePageStack {
  17. final PageStackBloc _bloc = PageStackBloc();
  18. HomePageStack();
  19. String title() {
  20. return _bloc.state.stackView.title;
  21. }
  22. void setStackView(HomeStackView? stackView) {
  23. _bloc.add(PageStackEvent.setStackView(
  24. stackView ?? const AnnouncementStackView()));
  25. }
  26. Widget stackTopBar() {
  27. return BlocProvider<PageStackBloc>(
  28. create: (context) => _bloc,
  29. child: BlocBuilder<PageStackBloc, PageStackState>(
  30. builder: (context, state) {
  31. return HomeTopBar(
  32. view: state.stackView,
  33. );
  34. },
  35. ),
  36. );
  37. }
  38. Widget stackWidget() {
  39. return BlocProvider<PageStackBloc>(
  40. create: (context) => _bloc,
  41. child: BlocBuilder<PageStackBloc, PageStackState>(
  42. builder: (context, state) {
  43. return FadingIndexedStack(
  44. index: pages.indexOf(state.stackView.type),
  45. children: _buildStackWidget(state.stackView),
  46. );
  47. },
  48. ),
  49. );
  50. }
  51. }
  52. List<ViewType> pages = ViewType.values.toList();
  53. List<Widget> _buildStackWidget(HomeStackView stackView) {
  54. return ViewType.values.map((viewType) {
  55. if (viewType == stackView.type) {
  56. switch (stackView.type) {
  57. case ViewType.Blank:
  58. return AnnouncementPage(
  59. stackView: stackView as AnnouncementStackView);
  60. case ViewType.Doc:
  61. final docView = stackView as DocPageStackView;
  62. return DocPage(key: ValueKey(docView.view.id), stackView: docView);
  63. default:
  64. return AnnouncementPage(
  65. stackView: stackView as AnnouncementStackView);
  66. }
  67. } else {
  68. return const AnnouncementPage(stackView: AnnouncementStackView());
  69. }
  70. }).toList();
  71. }
  72. HomeStackView stackViewFromView(View view) {
  73. switch (view.viewType) {
  74. case ViewType.Blank:
  75. return const AnnouncementStackView();
  76. case ViewType.Doc:
  77. return DocPageStackView(view);
  78. default:
  79. return const AnnouncementStackView();
  80. }
  81. }
  82. abstract class HomeStackWidget extends StatefulWidget {
  83. final HomeStackView stackView;
  84. const HomeStackWidget({Key? key, required this.stackView}) : super(key: key);
  85. }