page_stack.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'package:flowy_infra/notifier.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:provider/provider.dart';
  4. import 'package:app_flowy/startup/startup.dart';
  5. import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
  6. import 'package:app_flowy/workspace/presentation/stack_page/home_stack.dart';
  7. import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
  8. typedef NavigationCallback = void Function(String id);
  9. abstract class NavigationItem {
  10. Widget get leftBarItem;
  11. Widget? get rightBarItem => null;
  12. String get identifier;
  13. NavigationCallback get action => (id) {
  14. getIt<HomeStackManager>().setStackWithId(id);
  15. };
  16. }
  17. enum HomeStackType {
  18. blank,
  19. doc,
  20. trash,
  21. }
  22. List<HomeStackType> pages = HomeStackType.values.toList();
  23. abstract class HomeStackContext<T, S> with NavigationItem {
  24. List<NavigationItem> get navigationItems;
  25. @override
  26. Widget get leftBarItem;
  27. @override
  28. Widget? get rightBarItem;
  29. @override
  30. String get identifier;
  31. ValueNotifier<T> get isUpdated;
  32. HomeStackType get type;
  33. Widget buildWidget();
  34. void dispose();
  35. }
  36. class HomeStackNotifier extends ChangeNotifier {
  37. HomeStackContext stackContext;
  38. PublishNotifier<bool> collapsedNotifier = PublishNotifier();
  39. Widget get titleWidget => stackContext.leftBarItem;
  40. HomeStackNotifier({HomeStackContext? context}) : stackContext = context ?? BlankStackContext();
  41. set context(HomeStackContext context) {
  42. stackContext.isUpdated.removeListener(notifyListeners);
  43. stackContext.dispose();
  44. stackContext = context;
  45. stackContext.isUpdated.addListener(notifyListeners);
  46. notifyListeners();
  47. }
  48. HomeStackContext get context => stackContext;
  49. }
  50. // HomeStack is initialized as singleton to controll the page stack.
  51. class HomeStackManager {
  52. final HomeStackNotifier _notifier = HomeStackNotifier();
  53. HomeStackManager();
  54. Widget title() {
  55. return _notifier.context.leftBarItem;
  56. }
  57. PublishNotifier<bool> get collapsedNotifier => _notifier.collapsedNotifier;
  58. void switchStack(HomeStackContext context) {
  59. _notifier.context = context;
  60. }
  61. void setStackWithId(String id) {}
  62. Widget stackTopBar() {
  63. return MultiProvider(
  64. providers: [
  65. ChangeNotifierProvider.value(value: _notifier),
  66. ],
  67. child: Selector<HomeStackNotifier, Widget>(
  68. selector: (context, notifier) => notifier.titleWidget,
  69. builder: (context, widget, child) {
  70. return const HomeTopBar();
  71. },
  72. ),
  73. );
  74. }
  75. Widget stackWidget() {
  76. return MultiProvider(
  77. providers: [
  78. ChangeNotifierProvider.value(value: _notifier),
  79. ],
  80. child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {
  81. return FadingIndexedStack(
  82. index: pages.indexOf(notifier.context.type),
  83. children: HomeStackType.values.map((viewType) {
  84. if (viewType == notifier.context.type) {
  85. return notifier.context.buildWidget();
  86. } else {
  87. return const BlankStackPage();
  88. }
  89. }).toList(),
  90. );
  91. }),
  92. );
  93. }
  94. }