| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 | import 'package:flowy_sdk/log.dart';import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';import 'group_listener.dart';typedef OnGroupError = void Function(FlowyError);abstract class GroupControllerDelegate {  void removeRow(String groupId, String rowId);  void insertRow(String groupId, RowPB row, int? index);  void updateRow(String groupId, RowPB row);}class GroupController {  final GroupPB group;  final GroupListener _listener;  final GroupControllerDelegate delegate;  GroupController({    required String gridId,    required this.group,    required this.delegate,  }) : _listener = GroupListener(group);  RowPB? rowAtIndex(int index) {    if (index < group.rows.length) {      return group.rows[index];    } else {      return null;    }  }  void startListening() {    _listener.start(onGroupChanged: (result) {      result.fold(        (GroupRowsChangesetPB changeset) {          for (final insertedRow in changeset.insertedRows) {            final index = insertedRow.hasIndex() ? insertedRow.index : null;            delegate.insertRow(              group.groupId,              insertedRow.row,              index,            );          }          for (final deletedRow in changeset.deletedRows) {            delegate.removeRow(group.groupId, deletedRow);          }          for (final updatedRow in changeset.updatedRows) {            delegate.updateRow(group.groupId, updatedRow);          }        },        (err) => Log.error(err),      );    });  }  Future<void> dispose() async {    _listener.stop();  }}
 |