From 241581686bee64be284faf8154805c7ca6b0d04a Mon Sep 17 00:00:00 2001 From: hejl Date: Tue, 24 Jun 2025 11:14:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=8C=E7=A7=BB=E5=8A=A8=E5=92=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/code_creater_controller.dart | 8 +++- .../widgets/code_creater_view.dart | 42 +++++++++++-------- .../code_creater/widgets/node_table.dart | 14 +++++-- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart b/win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart index 6e3e2b1..2a367f1 100644 --- a/win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart +++ b/win_text_editor/lib/modules/code_creater/controllers/code_creater_controller.dart @@ -3,7 +3,13 @@ import 'package:win_text_editor/modules/outline/models/outline_node.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart'; class CodeCreaterController extends BaseContentController { - List members = []; + List _members = []; + List get members => _members; + + void updateMembers(List newMembers) { + _members = newMembers; + notifyListeners(); // 通知监听者 + } @override void onOpenFile(String filePath, {dynamic appendArg}) { diff --git a/win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart b/win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart index fc09f51..0b2c64e 100644 --- a/win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart +++ b/win_text_editor/lib/modules/code_creater/widgets/code_creater_view.dart @@ -2,6 +2,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:win_text_editor/framework/controllers/logger.dart'; import 'package:win_text_editor/framework/controllers/tab_items_controller.dart'; import 'package:win_text_editor/modules/code_creater/controllers/code_creater_controller.dart'; import 'package:win_text_editor/modules/code_creater/widgets/node_table.dart'; @@ -65,6 +66,7 @@ class _CodeCreaterViewState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: NodeTable( + key: ValueKey(_controller.members.length), // 确保唯一绑定 members: _controller.members, onMoveMember: _moveMember, onDeleteMember: _deleteMember, @@ -96,31 +98,35 @@ class _CodeCreaterViewState extends State { } void _moveMember(int index, int direction) { - final newIndex = index + direction; - if (newIndex >= 0 && newIndex < _controller.members.length) { - setState(() { - final member = _controller.members.removeAt(index); - _controller.members.insert(newIndex, member); - }); + _move(index, index + direction); + } + + void _move(int from, int to) async { + if (from < 0 || + from >= _controller.members.length || + to < 0 || + to >= _controller.members.length) { + return; // 越界检查 } + + final member = _controller.members[from]; + setState(() { + _controller.members.removeAt(from); + }); + + await Future.delayed(const Duration(milliseconds: 50)); // 让 UI 响应删除操作 + + setState(() { + _controller.members.insert(to, member); // 再插入 + }); } void _moveToTop(int index) { - if (index > 0) { - setState(() { - final member = _controller.members.removeAt(index); - _controller.members.insert(0, member); - }); - } + _move(index, 0); } void _moveToBottom(int index) { - if (index < _controller.members.length - 1) { - setState(() { - final member = _controller.members.removeAt(index); - _controller.members.add(member); - }); - } + _move(index, _controller.members.length - 1); } void _deleteMember(int index) { diff --git a/win_text_editor/lib/modules/code_creater/widgets/node_table.dart b/win_text_editor/lib/modules/code_creater/widgets/node_table.dart index cf3df02..0defa67 100644 --- a/win_text_editor/lib/modules/code_creater/widgets/node_table.dart +++ b/win_text_editor/lib/modules/code_creater/widgets/node_table.dart @@ -24,7 +24,7 @@ class NodeTable extends StatefulWidget { }); @override - State createState() => _NodeTableState(); + State createState() => NodeTableState(); } class _NodeTypeData { @@ -34,7 +34,7 @@ class _NodeTypeData { _NodeTypeData(this.originalType, this.currentSelection); } -class _NodeTableState extends State { +class NodeTableState extends State { PlutoGridStateManager? _stateManager; int? _selectedRowIndex; final ScrollController _scrollController = ScrollController(); @@ -67,7 +67,7 @@ class _NodeTableState extends State { child: SizedBox( width: MediaQuery.of(context).size.width * 0.4, child: PlutoGrid( - key: ValueKey('pluto_grid_${widget.members.length}'), + key: widget.key, configuration: MyPlutoGridConfiguration(), columns: _buildColumns(), mode: PlutoGridMode.normal, @@ -234,6 +234,14 @@ class _NodeTableState extends State { } } + void refreshTable() { + if (_stateManager != null) { + _stateManager!.refRows.clear(); + _stateManager!.refRows.addAll(_buildRows(widget.members)); + _stateManager!.notifyListeners(); + } + } + @override void dispose() { _stateManager?.removeListener(_handleRowSelection);