如何最好地从函数中返回不同类型的单个值

时间:2019-05-03 11:16:55

标签: dynamic dart flutter google-cloud-firestore

我有一个返回错误消息(字符串)或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(强调非常紧凑的代码))的最佳方法是什么?

1 个答案:

答案 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