如何使用变量作为方法名称
Posted
技术标签:
【中文标题】如何使用变量作为方法名称【英文标题】:How to use a variable for method name 【发布时间】:2021-11-11 18:53:22 【问题描述】:我想使用一个变量来访问我的 hive 数据库中的某个值: 在下面的代码中,如果我使用 myBox.getAt(i).attributeSelect 我会收到错误,因为未为框定义 attributeSelect。 如果我使用 myBox.getAt(i).test 它可以工作。我怎样才能让颤振认识到 attributeSelect 是一个变量并将值放在那里?我总共有 181 个不同的变量可供用户选择。我真的需要那么多 if 子句吗?变量是布尔值。所以我想检查索引 i 处的文档的该属性是否为真。
错误:NoSuchMethodError:'attributeSelect' 找不到方法 接收方:“HiveDocMod”实例
attributeSelect = 'test'; //value depends on user choice
Future<void> queryHiveDocs() async
final myBox = await Hive.openBox('my');
for (var i = 0; i < myBox.length; i++)
if (attributeSelect == 'All Documents')
_hiveDocs.add(myBox.getAt(i)); // get all documents
//print(myBox.getAt(24).vesselId);
else
// Query for attribute
if (myBox.getAt(i).attributeSelect)
_hiveDocs.add(myBox.getAt(i)); // get only docs where the attributeSelect is true
setState(()
_hiveDocs = _hiveDocs;
_isLoading = false;
);
【问题讨论】:
可能您需要使用 TypeAdapter 设置您的类。 docs.hivedb.dev/#/custom-objects/generate_adapter 你能发布更完整的代码(理想情况下是一个最小的、可重现的例子)吗?attributeSelect
声明在哪里?
typeadapter 是为测试等设置的。正如我所说,如果我写 myBox.getAt(i).test,它工作正常,但是用 attributeSelect = test 写 myBox.getAt(i).attributeSelect不起作用,因为它不使用该变量的值。
我知道您现在要做什么:您想使用 String
作为属性名称。如果没有代码生成,这是不可能的。或者,您可以存储 Map<String, bool>
。
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
【参考方案1】:
我以令人讨厌的方式解决了它:
if (attributeSelect == 'crsAirCompressor')
if (myBox.getAt(i).crsAirCompressor)
_hiveDocs.add(myBox.getAt(i));
else if (attributeSelect == 'crsBatteries')
if (myBox.getAt(i).crsBatteries)
_hiveDocs.add(myBox.getAt(i));
...
【讨论】:
即使有 100 个 if 子句,它仍然会在一瞬间运行。以这种方式编程很烦人。希望 isar 很快就能正常工作,我们不需要编写自己的查询。在此之前,这已经足够好了。以上是关于如何使用变量作为方法名称的主要内容,如果未能解决你的问题,请参考以下文章