我有一个返回错误消息(字符串)或Firestore DocumentReference的函数。我打算使用一个包含两者的类,并测试错误消息是否为非null来检测错误,如果不是,则引用有效。我认为这太冗长了,然后认为返回var可能更整洁。但是,不允许返回var。因此,我返回一个动态值,并测试result是否为String以检测错误。 IE浏览器。
dynamic varResult = insertDoc(_sCollection,
dataRec.toJson());
if (varResult is String) {
然后,在检查合规性之后,我从其中一位专家那里读取了以下内容: “将函数显式标记为返回Dynamic(或var,Any或任何您选择调用的函数)是一种不好的风格。很少需要知道它(仅在实例化具有多个类型参数的泛型时)其中有些是已知的,有些则不是。”
如果可以的话,我很乐意使用dynamic作为返回值,但是通常我会尝试遵循最佳实践。我也非常了解膨胀的软件,因此我极力避免使用该软件。这就是为什么我不想使用Class作为返回值。
处理上述情况(返回类型可能是String或其他对象,在这种情况下是Firestore DocumentReference(强调非常紧凑的代码))的最佳方法是什么?
答案 0 :(得分:1)
一个选择是创建一个抽象状态类。像这样:
abstract class DocumentInsertionState {
const DocumentInsertionState();
}
class DocumentInsertionError extends DocumentInsertionState {
final String message;
const DocumentInsertionError(this.message);
}
class DocumentInsertionSuccess<T> extends DocumentInsertionState {
final T object;
const DocumentInsertionSuccess(this.object);
}
class Test {
void doSomething() {
final state = insertDoc();
if (state is DocumentInsertionError) {
}
}
DocumentInsertionState insertDoc() {
try {
return DocumentInsertionSuccess("It worked");
} catch (e) {
return DocumentInsertionError(e.toString());
}
}
}
此处的完整示例:https://github.com/ReactiveX/rxdart/tree/master/example/flutter/github_search