page_stack.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import 'package:equatable/equatable.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 titleWidget;
  11. String get identifier;
  12. NavigationCallback get action => (id) {
  13. getIt<HomeStackManager>().setStackWithId(id);
  14. };
  15. }
  16. enum HomeStackType {
  17. blank,
  18. doc,
  19. trash,
  20. }
  21. List<HomeStackType> pages = HomeStackType.values.toList();
  22. abstract class HomeStackContext extends Equatable with NavigationItem {
  23. List<NavigationItem> get navigationItems;
  24. @override
  25. Widget get titleWidget;
  26. @override
  27. String get identifier;
  28. HomeStackType get type;
  29. Widget render();
  30. }
  31. class HomeStackNotifier extends ChangeNotifier {
  32. HomeStackContext inner;
  33. HomeStackNotifier({HomeStackContext? context}) : inner = context ?? BlankStackContext();
  34. set context(HomeStackContext context) {
  35. inner = context;
  36. notifyListeners();
  37. }
  38. HomeStackContext get context => inner;
  39. }
  40. // HomeStack is initialized as singleton to controll the page stack.
  41. class HomeStackManager {
  42. final HomeStackNotifier _notifier = HomeStackNotifier();
  43. HomeStackManager();
  44. Widget title() {
  45. return _notifier.context.titleWidget;
  46. }
  47. void setStack(HomeStackContext context) {
  48. _notifier.context = context;
  49. }
  50. void setStackWithId(String id) {}
  51. Widget stackTopBar() {
  52. return MultiProvider(
  53. providers: [
  54. ChangeNotifierProvider.value(value: _notifier),
  55. ],
  56. child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {
  57. return HomeTopBar(view: notifier.context);
  58. }),
  59. );
  60. }
  61. Widget stackWidget() {
  62. return MultiProvider(
  63. providers: [
  64. ChangeNotifierProvider.value(value: _notifier),
  65. ],
  66. child: Consumer(builder: (ctx, HomeStackNotifier notifier, child) {
  67. return FadingIndexedStack(
  68. index: pages.indexOf(notifier.context.type),
  69. children: HomeStackType.values.map((viewType) {
  70. if (viewType == notifier.context.type) {
  71. return notifier.context.render();
  72. } else {
  73. return const BlankStackPage();
  74. }
  75. }).toList(),
  76. );
  77. }),
  78. );
  79. }
  80. }