Forráskód Böngészése

[flutter]: fix some bugs

appflowy 3 éve
szülő
commit
f908cc2cab

+ 0 - 2
app_flowy/lib/user/presentation/skip_log_in_screen.dart

@@ -1,4 +1,3 @@
-import 'package:app_flowy/startup/startup.dart';
 import 'package:app_flowy/user/domain/i_auth.dart';
 import 'package:app_flowy/user/presentation/widgets/background.dart';
 import 'package:app_flowy/workspace/domain/i_user.dart';
@@ -10,7 +9,6 @@ import 'package:flowy_infra_ui/widget/spacing.dart';
 import 'package:flowy_log/flowy_log.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart';
-import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_create.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';

+ 0 - 1
app_flowy/lib/user/presentation/splash_screen.dart

@@ -2,7 +2,6 @@ import 'package:app_flowy/startup/startup.dart';
 import 'package:app_flowy/user/application/splash_bloc.dart';
 import 'package:app_flowy/user/domain/auth_state.dart';
 import 'package:app_flowy/user/domain/i_splash.dart';
-import 'package:flowy_log/flowy_log.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace-infra/errors.pb.dart';
 import 'package:flutter/material.dart';

+ 3 - 3
app_flowy/lib/workspace/application/menu/menu_bloc.dart

@@ -52,7 +52,7 @@ class MenuBloc extends Bloc<MenuEvent, MenuState> {
   }
 
   Stream<MenuState> _performActionOnOpenPage(OpenPage e) async* {
-    yield state.copyWith(context: e.context);
+    yield state.copyWith(stackContext: e.context);
   }
 
   Stream<MenuState> _performActionOnCreateApp(CreateApp event) async* {
@@ -101,13 +101,13 @@ class MenuState with _$MenuState {
     required bool isCollapse,
     required Option<List<App>> apps,
     required Either<Unit, WorkspaceError> successOrFailure,
-    required HomeStackContext context,
+    required HomeStackContext stackContext,
   }) = _MenuState;
 
   factory MenuState.initial() => MenuState(
         isCollapse: false,
         apps: none(),
         successOrFailure: left(unit),
-        context: BlankStackContext(),
+        stackContext: BlankStackContext(),
       );
 }

+ 22 - 21
app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart

@@ -859,12 +859,12 @@ class _$MenuStateTearOff {
       {required bool isCollapse,
       required Option<List<App>> apps,
       required Either<Unit, WorkspaceError> successOrFailure,
-      required HomeStackContext<dynamic, dynamic> context}) {
+      required HomeStackContext<dynamic, dynamic> stackContext}) {
     return _MenuState(
       isCollapse: isCollapse,
       apps: apps,
       successOrFailure: successOrFailure,
-      context: context,
+      stackContext: stackContext,
     );
   }
 }
@@ -878,7 +878,7 @@ mixin _$MenuState {
   Option<List<App>> get apps => throw _privateConstructorUsedError;
   Either<Unit, WorkspaceError> get successOrFailure =>
       throw _privateConstructorUsedError;
-  HomeStackContext<dynamic, dynamic> get context =>
+  HomeStackContext<dynamic, dynamic> get stackContext =>
       throw _privateConstructorUsedError;
 
   @JsonKey(ignore: true)
@@ -894,7 +894,7 @@ abstract class $MenuStateCopyWith<$Res> {
       {bool isCollapse,
       Option<List<App>> apps,
       Either<Unit, WorkspaceError> successOrFailure,
-      HomeStackContext<dynamic, dynamic> context});
+      HomeStackContext<dynamic, dynamic> stackContext});
 }
 
 /// @nodoc
@@ -910,7 +910,7 @@ class _$MenuStateCopyWithImpl<$Res> implements $MenuStateCopyWith<$Res> {
     Object? isCollapse = freezed,
     Object? apps = freezed,
     Object? successOrFailure = freezed,
-    Object? context = freezed,
+    Object? stackContext = freezed,
   }) {
     return _then(_value.copyWith(
       isCollapse: isCollapse == freezed
@@ -925,9 +925,9 @@ class _$MenuStateCopyWithImpl<$Res> implements $MenuStateCopyWith<$Res> {
           ? _value.successOrFailure
           : successOrFailure // ignore: cast_nullable_to_non_nullable
               as Either<Unit, WorkspaceError>,
-      context: context == freezed
-          ? _value.context
-          : context // ignore: cast_nullable_to_non_nullable
+      stackContext: stackContext == freezed
+          ? _value.stackContext
+          : stackContext // ignore: cast_nullable_to_non_nullable
               as HomeStackContext<dynamic, dynamic>,
     ));
   }
@@ -943,7 +943,7 @@ abstract class _$MenuStateCopyWith<$Res> implements $MenuStateCopyWith<$Res> {
       {bool isCollapse,
       Option<List<App>> apps,
       Either<Unit, WorkspaceError> successOrFailure,
-      HomeStackContext<dynamic, dynamic> context});
+      HomeStackContext<dynamic, dynamic> stackContext});
 }
 
 /// @nodoc
@@ -960,7 +960,7 @@ class __$MenuStateCopyWithImpl<$Res> extends _$MenuStateCopyWithImpl<$Res>
     Object? isCollapse = freezed,
     Object? apps = freezed,
     Object? successOrFailure = freezed,
-    Object? context = freezed,
+    Object? stackContext = freezed,
   }) {
     return _then(_MenuState(
       isCollapse: isCollapse == freezed
@@ -975,9 +975,9 @@ class __$MenuStateCopyWithImpl<$Res> extends _$MenuStateCopyWithImpl<$Res>
           ? _value.successOrFailure
           : successOrFailure // ignore: cast_nullable_to_non_nullable
               as Either<Unit, WorkspaceError>,
-      context: context == freezed
-          ? _value.context
-          : context // ignore: cast_nullable_to_non_nullable
+      stackContext: stackContext == freezed
+          ? _value.stackContext
+          : stackContext // ignore: cast_nullable_to_non_nullable
               as HomeStackContext<dynamic, dynamic>,
     ));
   }
@@ -990,7 +990,7 @@ class _$_MenuState implements _MenuState {
       {required this.isCollapse,
       required this.apps,
       required this.successOrFailure,
-      required this.context});
+      required this.stackContext});
 
   @override
   final bool isCollapse;
@@ -999,11 +999,11 @@ class _$_MenuState implements _MenuState {
   @override
   final Either<Unit, WorkspaceError> successOrFailure;
   @override
-  final HomeStackContext<dynamic, dynamic> context;
+  final HomeStackContext<dynamic, dynamic> stackContext;
 
   @override
   String toString() {
-    return 'MenuState(isCollapse: $isCollapse, apps: $apps, successOrFailure: $successOrFailure, context: $context)';
+    return 'MenuState(isCollapse: $isCollapse, apps: $apps, successOrFailure: $successOrFailure, stackContext: $stackContext)';
   }
 
   @override
@@ -1018,8 +1018,9 @@ class _$_MenuState implements _MenuState {
             (identical(other.successOrFailure, successOrFailure) ||
                 const DeepCollectionEquality()
                     .equals(other.successOrFailure, successOrFailure)) &&
-            (identical(other.context, context) ||
-                const DeepCollectionEquality().equals(other.context, context)));
+            (identical(other.stackContext, stackContext) ||
+                const DeepCollectionEquality()
+                    .equals(other.stackContext, stackContext)));
   }
 
   @override
@@ -1028,7 +1029,7 @@ class _$_MenuState implements _MenuState {
       const DeepCollectionEquality().hash(isCollapse) ^
       const DeepCollectionEquality().hash(apps) ^
       const DeepCollectionEquality().hash(successOrFailure) ^
-      const DeepCollectionEquality().hash(context);
+      const DeepCollectionEquality().hash(stackContext);
 
   @JsonKey(ignore: true)
   @override
@@ -1041,7 +1042,7 @@ abstract class _MenuState implements MenuState {
       {required bool isCollapse,
       required Option<List<App>> apps,
       required Either<Unit, WorkspaceError> successOrFailure,
-      required HomeStackContext<dynamic, dynamic> context}) = _$_MenuState;
+      required HomeStackContext<dynamic, dynamic> stackContext}) = _$_MenuState;
 
   @override
   bool get isCollapse => throw _privateConstructorUsedError;
@@ -1051,7 +1052,7 @@ abstract class _MenuState implements MenuState {
   Either<Unit, WorkspaceError> get successOrFailure =>
       throw _privateConstructorUsedError;
   @override
-  HomeStackContext<dynamic, dynamic> get context =>
+  HomeStackContext<dynamic, dynamic> get stackContext =>
       throw _privateConstructorUsedError;
   @override
   @JsonKey(ignore: true)

+ 1 - 1
app_flowy/lib/workspace/domain/page_stack/page_stack.dart

@@ -82,7 +82,7 @@ class HomeStackManager {
 
   PublishNotifier<bool> get collapsedNotifier => _notifier.collapsedNotifier;
 
-  void switchStack(HomeStackContext context) {
+  void setStack(HomeStackContext context) {
     _notifier.context = context;
   }
 

+ 17 - 10
app_flowy/lib/workspace/presentation/home/home_screen.dart

@@ -5,7 +5,6 @@ import 'package:app_flowy/workspace/presentation/stack_page/home_stack.dart';
 import 'package:app_flowy/workspace/presentation/widgets/float_bubble/question_bubble.dart';
 import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
 import 'package:app_flowy/startup/startup.dart';
-import 'package:flowy_infra/notifier.dart';
 import 'package:flowy_log/flowy_log.dart';
 import 'package:flowy_infra_ui/style_widget/container.dart';
 import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
@@ -30,6 +29,17 @@ class HomeScreen extends StatefulWidget {
 class _HomeScreenState extends State<HomeScreen> {
   View? initialView;
 
+  @override
+  void initState() {
+    super.initState();
+  }
+
+  @override
+  void didUpdateWidget(covariant HomeScreen oldWidget) {
+    initialView = null;
+    super.didUpdateWidget(oldWidget);
+  }
+
   @override
   Widget build(BuildContext context) {
     return MultiBlocProvider(
@@ -54,6 +64,10 @@ class _HomeScreenState extends State<HomeScreen> {
           child: BlocBuilder<HomeBloc, HomeState>(
             buildWhen: (previous, current) => previous != current,
             builder: (context, state) {
+              final collapasedNotifier = getIt<HomeStackManager>().collapsedNotifier;
+              collapasedNotifier.addPublishListener((isCollapsed) {
+                context.read<HomeBloc>().add(HomeEvent.forceCollapse(isCollapsed));
+              });
               return FlowyContainer(
                 Theme.of(context).colorScheme.surface,
                 // Colors.white,
@@ -93,22 +107,15 @@ class _HomeScreenState extends State<HomeScreen> {
   }
 
   Widget _buildHomeMenu({required HomeLayout layout, required BuildContext context}) {
-    final homeBloc = context.read<HomeBloc>();
-
-    final collapasedNotifier = getIt<HomeStackManager>().collapsedNotifier;
-    collapasedNotifier.addPublishListener((isCollapsed) {
-      homeBloc.add(HomeEvent.forceCollapse(isCollapsed));
-    });
-
     if (initialView == null && widget.workspaceSetting.hasLatestView()) {
       initialView = widget.workspaceSetting.latestView;
-      getIt<HomeStackManager>().switchStack(initialView!.stackContext());
+      getIt<HomeStackManager>().setStack(initialView!.stackContext());
     }
 
     HomeMenu homeMenu = HomeMenu(
       user: widget.user,
       workspaceSetting: widget.workspaceSetting,
-      collapsedNotifier: collapasedNotifier,
+      collapsedNotifier: getIt<HomeStackManager>().collapsedNotifier,
     );
 
     return FocusTraversalGroup(child: RepaintBoundary(child: homeMenu));

+ 45 - 67
app_flowy/lib/workspace/presentation/widgets/menu/menu.dart

@@ -69,9 +69,9 @@ class HomeMenu extends StatelessWidget {
       child: MultiBlocListener(
         listeners: [
           BlocListener<MenuBloc, MenuState>(
-            listenWhen: (p, c) => p.context != c.context,
+            listenWhen: (p, c) => p.stackContext != c.stackContext,
             listener: (context, state) {
-              getIt<HomeStackManager>().switchStack(state.context);
+              getIt<HomeStackManager>().setStack(state.stackContext);
             },
           ),
           BlocListener<MenuBloc, MenuState>(
@@ -92,58 +92,60 @@ class HomeMenu extends StatelessWidget {
       color: Theme.of(context).colorScheme.background,
       child: ChangeNotifierProvider(
         create: (_) => MenuSharedState(view: workspaceSetting.hasLatestView() ? workspaceSetting.latestView : null),
-        child: Column(
-          mainAxisAlignment: MainAxisAlignment.start,
-          children: [
-            Expanded(
-              child: Column(
-                mainAxisAlignment: MainAxisAlignment.start,
-                children: [
-                  _renderTopBar(context),
-                  const VSpace(16),
-                  _renderApps(context),
-                ],
-              ).padding(horizontal: Insets.l),
-            ),
-            const VSpace(20),
-            _renderTrash(context).padding(horizontal: Insets.l),
-            const VSpace(20),
-            _renderNewAppButton(context),
-          ],
-        ),
+        child: Consumer(builder: (context, MenuSharedState sharedState, child) {
+          return Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            children: [
+              Expanded(
+                child: Column(
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    const MenuTopBar(),
+                    const VSpace(16),
+                    _renderApps(context),
+                  ],
+                ).padding(horizontal: Insets.l),
+              ),
+              const VSpace(20),
+              _renderTrash(context).padding(horizontal: Insets.l),
+              const VSpace(20),
+              _renderNewAppButton(context),
+            ],
+          );
+        }),
       ),
     );
   }
 
-  Widget _renderTopBar(BuildContext context) {
-    return const MenuTopBar();
-  }
-
   Widget _renderApps(BuildContext context) {
-    final apps = context.read<MenuBloc>().state.apps;
-    List<Widget> menuItems = [];
-    menuItems.add(MenuUser(user));
-    List<MenuApp> appWidgets = apps.foldRight([], (apps, _) => apps.map((app) => MenuApp(app)).toList());
-    menuItems.addAll(appWidgets);
-
     return ExpandableTheme(
       data: ExpandableThemeData(useInkWell: true, animationDuration: Durations.medium),
       child: Expanded(
         child: ScrollConfiguration(
           behavior: const ScrollBehavior().copyWith(scrollbars: false),
-          child: ListView.separated(
-            itemCount: menuItems.length,
-            separatorBuilder: (context, index) {
-              if (index == 0) {
-                return const VSpace(29);
-              } else {
-                return VSpace(MenuAppSizes.appVPadding);
-              }
-            },
-            physics: StyledScrollPhysics(),
-            itemBuilder: (BuildContext context, int index) {
-              return menuItems[index];
+          child: BlocSelector<MenuBloc, MenuState, List<Widget>>(
+            selector: (state) {
+              List<Widget> menuItems = [];
+              menuItems.add(MenuUser(user));
+              List<MenuApp> appWidgets =
+                  state.apps.foldRight([], (apps, _) => apps.map((app) => MenuApp(app)).toList());
+              menuItems.addAll(appWidgets);
+              return menuItems;
             },
+            builder: (context, menuItems) => ListView.separated(
+              itemCount: menuItems.length,
+              separatorBuilder: (context, index) {
+                if (index == 0) {
+                  return const VSpace(29);
+                } else {
+                  return VSpace(MenuAppSizes.appVPadding);
+                }
+              },
+              physics: StyledScrollPhysics(),
+              itemBuilder: (BuildContext context, int index) {
+                return menuItems[index];
+              },
+            ),
           ),
         ),
       ),
@@ -174,28 +176,4 @@ class MenuSharedState extends ChangeNotifier {
       selectedView.value = view;
     });
   }
-
-  // void addForcedOpenViewListener(void Function(View) callback) {
-  //   super.addListener(() {
-  //     if (_forcedOpenView != null) {
-  //       callback(_forcedOpenView!);
-  //     }
-  //   });
-  // }
-
-  // void addSelectedViewListener(void Function(View?) callback) {
-  //   super.addListener(() {
-  //     callback(_view);
-  //   });
-  // }
-
-  // set forcedOpenView(View? view) {
-  //   if (_forcedOpenView != view) {
-  //     _forcedOpenView = view;
-
-  //     selectedView = view;
-  //     notifyListeners();
-  //   }
-  // }
-
 }

+ 8 - 3
app_flowy/lib/workspace/presentation/widgets/menu/widget/app/menu_app.dart

@@ -8,7 +8,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:app_flowy/startup/startup.dart';
 import 'package:app_flowy/workspace/application/app/app_bloc.dart';
 import 'package:provider/provider.dart';
-import 'package:styled_widget/styled_widget.dart';
 import 'section/section.dart';
 
 class MenuApp extends StatefulWidget {
@@ -20,7 +19,13 @@ class MenuApp extends StatefulWidget {
 }
 
 class _MenuAppState extends State<MenuApp> {
-  final notifier = AppDataNotifier();
+  late AppDataNotifier notifier;
+
+  @override
+  void initState() {
+    notifier = AppDataNotifier();
+    super.initState();
+  }
 
   @override
   Widget build(BuildContext context) {
@@ -120,7 +125,7 @@ class AppDataNotifier extends ChangeNotifier {
   set selectedView(View? view) {
     _selectedView = view;
 
-    if (view != null) {
+    if (view != null && _views.isNotEmpty) {
       final isExpanded = _views.contains(view);
       if (expandController.expanded == false && expandController.expanded != isExpanded) {
         // Workaround: Delay 150 milliseconds to make the smooth animation while expanding

+ 1 - 1
app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/section.dart

@@ -109,7 +109,7 @@ class ViewSectionNotifier with ChangeNotifier {
 
     if (view != null) {
       WidgetsBinding.instance?.addPostFrameCallback((_) {
-        getIt<HomeStackManager>().switchStack(view.stackContext());
+        getIt<HomeStackManager>().setStack(view.stackContext());
       });
     } else {
       // do nothing

+ 1 - 1
app_flowy/lib/workspace/presentation/widgets/menu/widget/menu_trash.dart

@@ -19,7 +19,7 @@ class MenuTrash extends StatelessWidget {
       child: InkWell(
         onTap: () {
           Provider.of<MenuSharedState>(context, listen: false).selectedView.value = null;
-          getIt<HomeStackManager>().switchStack(TrashStackContext());
+          getIt<HomeStackManager>().setStack(TrashStackContext());
         },
         child: _render(context),
       ),

+ 1 - 1
rust-lib/flowy-workspace/src/services/view_controller.rs

@@ -145,7 +145,7 @@ impl ViewController {
 
         let duplicate_params = CreateViewParams {
             belong_to_id: view.belong_to_id.clone(),
-            name: format!("{}_copy", &view.name),
+            name: format!("{} (copy)", &view.name),
             desc: view.desc.clone(),
             thumbnail: "".to_owned(),
             view_type: view.view_type.clone(),