page_stack.dart 2.3 KB

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