page_stack.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'package:app_flowy/workspace/presentation/stack_page/doc/doc_stack_page.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:provider/provider.dart';
  6. import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
  7. import 'package:app_flowy/workspace/presentation/stack_page/fading_index_stack.dart';
  8. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  9. abstract class HomeStackContext extends Equatable {
  10. String get title;
  11. String get identifier;
  12. ViewType get type;
  13. Widget render();
  14. }
  15. HomeStackContext stackCtxFromView(View view) {
  16. switch (view.viewType) {
  17. case ViewType.Blank:
  18. return DefaultHomeStackContext();
  19. case ViewType.Doc:
  20. return DocStackContext(view: view);
  21. default:
  22. return DefaultHomeStackContext();
  23. }
  24. }
  25. class HomeStackNotifier extends ChangeNotifier {
  26. HomeStackContext inner;
  27. HomeStackNotifier({
  28. HomeStackContext? context,
  29. }) : inner = context ?? DefaultHomeStackContext();
  30. set context(HomeStackContext context) {
  31. inner = context;
  32. notifyListeners();
  33. }
  34. HomeStackContext get context => inner;
  35. }
  36. // HomePageStack is initialized as singleton to controll the page stack.
  37. class HomeStack {
  38. final HomeStackNotifier _notifier = HomeStackNotifier();
  39. HomeStack();
  40. String title() {
  41. return _notifier.context.title;
  42. }
  43. void setStack(HomeStackContext context) {
  44. _notifier.context = context;
  45. }
  46. Widget stackTopBar() {
  47. return MultiProvider(
  48. providers: [
  49. ChangeNotifierProvider.value(value: _notifier),
  50. ],
  51. child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {
  52. return HomeTopBar(view: notifier.context);
  53. }),
  54. );
  55. }
  56. Widget stackWidget() {
  57. return MultiProvider(
  58. providers: [
  59. ChangeNotifierProvider.value(value: _notifier),
  60. ],
  61. child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {
  62. return FadingIndexedStack(
  63. index: pages.indexOf(notifier.context.type),
  64. children: ViewType.values.map((viewType) {
  65. if (viewType == notifier.context.type) {
  66. return notifier.context.render();
  67. } else {
  68. return const AnnouncementStackPage();
  69. }
  70. }).toList(),
  71. );
  72. }),
  73. );
  74. }
  75. }
  76. List<ViewType> pages = ViewType.values.toList();