浏览代码

fix: can't find context after popover disappear

appflowy 2 年之前
父节点
当前提交
af98febcb0

+ 20 - 14
frontend/app_flowy/lib/plugins/grid/presentation/widgets/header/field_cell_action_sheet.dart

@@ -93,9 +93,9 @@ class _EditFieldButton extends StatelessWidget {
 }
 
 class _FieldOperationList extends StatelessWidget {
-  final GridFieldCellContext fieldData;
+  final GridFieldCellContext fieldContext;
   final VoidCallback onDismissed;
-  const _FieldOperationList(this.fieldData, this.onDismissed, {Key? key})
+  const _FieldOperationList(this.fieldContext, this.onDismissed, {Key? key})
       : super(key: key);
 
   @override
@@ -118,14 +118,14 @@ class _FieldOperationList extends StatelessWidget {
         bool enable = true;
         switch (action) {
           case FieldAction.delete:
-            enable = !fieldData.field.isPrimary;
+            enable = !fieldContext.field.isPrimary;
             break;
           default:
             break;
         }
 
         return FieldActionCell(
-          fieldId: fieldData.field.id,
+          fieldContext: fieldContext,
           action: action,
           onTap: onDismissed,
           enable: enable,
@@ -136,13 +136,13 @@ class _FieldOperationList extends StatelessWidget {
 }
 
 class FieldActionCell extends StatelessWidget {
-  final String fieldId;
+  final GridFieldCellContext fieldContext;
   final VoidCallback onTap;
   final FieldAction action;
   final bool enable;
 
   const FieldActionCell({
-    required this.fieldId,
+    required this.fieldContext,
     required this.action,
     required this.onTap,
     required this.enable,
@@ -161,7 +161,7 @@ class FieldActionCell extends StatelessWidget {
       hoverColor: theme.hover,
       onTap: () {
         if (enable) {
-          action.run(context);
+          action.run(context, fieldContext);
           onTap();
         }
       },
@@ -202,7 +202,7 @@ extension _FieldActionExtension on FieldAction {
     }
   }
 
-  void run(BuildContext context) {
+  void run(BuildContext context, GridFieldCellContext fieldContext) {
     switch (this) {
       case FieldAction.hide:
         context
@@ -210,18 +210,24 @@ extension _FieldActionExtension on FieldAction {
             .add(const FieldActionSheetEvent.hideField());
         break;
       case FieldAction.duplicate:
-        context
-            .read<FieldActionSheetBloc>()
-            .add(const FieldActionSheetEvent.duplicateField());
+        PopoverContainer.of(context).close();
+
+        FieldService(
+          gridId: fieldContext.gridId,
+          fieldId: fieldContext.field.id,
+        ).duplicateField();
+
         break;
       case FieldAction.delete:
         PopoverContainer.of(context).close();
+
         NavigatorAlertDialog(
           title: LocaleKeys.grid_field_deleteFieldPromptMessage.tr(),
           confirm: () {
-            context
-                .read<FieldActionSheetBloc>()
-                .add(const FieldActionSheetEvent.deleteField());
+            FieldService(
+              gridId: fieldContext.gridId,
+              fieldId: fieldContext.field.id,
+            ).deleteField();
           },
         ).show(context);
 

+ 2 - 3
frontend/app_flowy/packages/appflowy_popover/lib/src/popover.dart

@@ -136,7 +136,6 @@ class PopoverState extends State<Popover> {
 
       return Stack(children: children);
     });
-
     _rootEntry.addEntry(context, this, newEntry, widget.asBarrier);
   }
 
@@ -243,7 +242,7 @@ class PopoverContainerState extends State<PopoverContainer> {
     );
   }
 
-  close() => widget.onClose();
+  void close() => widget.onClose();
 
-  closeAll() => widget.onCloseAll();
+  void closeAll() => widget.onCloseAll();
 }