page_stack.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import 'package:equatable/equatable.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-workspace/view_create.pb.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:provider/provider.dart';
  5. import 'package:app_flowy/workspace/presentation/doc/doc_page.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. abstract class HomeStackView extends Equatable {
  10. final ViewType type;
  11. final String title;
  12. final String identifier;
  13. const HomeStackView(
  14. {required this.type, required this.title, required this.identifier});
  15. }
  16. class PageStackNotifier extends ChangeNotifier {
  17. HomeStackView? innerView;
  18. PageStackNotifier({
  19. this.innerView,
  20. });
  21. set view(HomeStackView view) {
  22. innerView = view;
  23. notifyListeners();
  24. }
  25. HomeStackView get view {
  26. return innerView ?? const AnnouncementStackView();
  27. }
  28. }
  29. // HomePageStack is initialized as singleton to controll the page stack.
  30. class HomePageStack {
  31. final PageStackNotifier _notifier = PageStackNotifier();
  32. HomePageStack();
  33. String title() {
  34. return _notifier.view.title;
  35. }
  36. void setStackView(HomeStackView? stackView) {
  37. _notifier.view = stackView ?? const AnnouncementStackView();
  38. }
  39. Widget stackTopBar() {
  40. return MultiProvider(
  41. providers: [
  42. ChangeNotifierProvider(create: (_) => _notifier),
  43. ],
  44. child: Consumer(builder: (ctx, PageStackNotifier notifier, child) {
  45. return HomeTopBar(view: notifier.view);
  46. }),
  47. );
  48. }
  49. Widget stackWidget() {
  50. return MultiProvider(
  51. providers: [
  52. ChangeNotifierProvider(create: (_) => _notifier),
  53. ],
  54. child: Consumer(builder: (ctx, PageStackNotifier notifier, child) {
  55. return FadingIndexedStack(
  56. index: pages.indexOf(notifier.view.type),
  57. children: _buildStackWidget(notifier.view),
  58. );
  59. }),
  60. );
  61. }
  62. }
  63. List<ViewType> pages = ViewType.values.toList();
  64. List<Widget> _buildStackWidget(HomeStackView stackView) {
  65. return ViewType.values.map((viewType) {
  66. if (viewType == stackView.type) {
  67. switch (stackView.type) {
  68. case ViewType.Blank:
  69. return AnnouncementPage(
  70. stackView: stackView as AnnouncementStackView);
  71. case ViewType.Doc:
  72. final docView = stackView as DocPageStackView;
  73. return DocPage(key: ValueKey(docView.view.id), stackView: docView);
  74. default:
  75. return AnnouncementPage(
  76. stackView: stackView as AnnouncementStackView);
  77. }
  78. } else {
  79. return const AnnouncementPage(stackView: AnnouncementStackView());
  80. }
  81. }).toList();
  82. }
  83. HomeStackView stackViewFromView(View view) {
  84. switch (view.viewType) {
  85. case ViewType.Blank:
  86. return const AnnouncementStackView();
  87. case ViewType.Doc:
  88. return DocPageStackView(view);
  89. default:
  90. return const AnnouncementStackView();
  91. }
  92. }
  93. abstract class HomeStackWidget extends StatefulWidget {
  94. final HomeStackView stackView;
  95. const HomeStackWidget({Key? key, required this.stackView}) : super(key: key);
  96. }