【问题标题】:Dart changing a variable value using own extension methodDart 使用自己的扩展方法更改变量值
【发布时间】:2021-09-18 02:36:51
【问题描述】:

我试图使用我自己的扩展程序删除列表中的元素,但出现错误。此错误表示扩展程序只能读取。

这是我的扩展

extension ToListExtention on List {
  List toDatatable() {
    List columns = [];
    List rows = [];
    (this.first as Map).forEach((key, value) {columns.add(key);});
    this.forEach((element) {
      rows.add((element as Map).values);
    });
    **this.clear();**
    return [columns,rows];
  }
}

这是我得到的错误

E/flutter (24973): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Unsupported operation: read-only
E/flutter (24973): #0      QueryResultSet.length= (package:sqflite_common/src/collection_utils.dart:109:5)
E/flutter (24973): #1      ListMixin.clear (dart:collection/list.dart:342:10)
E/flutter (24973): #2      ToListExtention.toDatatable (package:dbdeneme/Extentions.dart:9:10)
E/flutter (24973): #3      _AnasayfaState.build.<anonymous closure>.<anonymous closure> (package:dbdeneme/main.dart:58:27)
E/flutter (24973): #4      _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (24973): #5      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (24973): <asynchronous suspension>

因此,如您所知,粗体线不起作用。如何在我自己的扩展中做到这一点?

【问题讨论】:

  • 这取决于List。一些 List 对象受到保护,例如const 列表或 List 尚未定义为 growable(因为我们不允许更改其大小)。在您的情况下,List 实际上是一个只读列表,这意味着不允许更改列表的操作。

标签: android flutter dart native extension-methods


【解决方案1】:

在扩展中,您不能更改对象的原始值。 您可以复制列表,然后对该列表进行各种操作。但是您不能更改列表。

【讨论】:

  • 错了。只要您遵循该列表的规则,您就可以在扩展方法中更改列表的内容(例如,如果您想更改其大小,它必须是可增长的)。
  • 我使用 List.generate 创建了一个列表,并将可增长参数设置为 True,但它不起作用。我还必须遵守什么规则?
【解决方案2】:

您的问题是您调用toDatatable 的列表是QueryResultSet,可以在此处找到其实现: https://github.com/tekartik/sqflite/blob/81c0c30aa59d7d3f229bf6ce0494458f96f893c2/sqflite_common/lib/src/collection_utils.dart#L74

其中实现了length(由clear() 调用),具有以下内容:

  @override
  set length(int newLength) {
    throw UnsupportedError('read-only');
  }

因此,您当前的扩展方法不适用于这种ListList 在这种情况下只是一个接口,QueryResultSet 正在实现该接口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多