飞镖不变性

时间:2017-07-19 12:54:57

标签: dart flutter

AuthState copy({
    FirebaseUser firebaseUser,
    String token,

    List<Map> contracts,
    bool loadingContracts,
    String contractsError,

    List<Map> searchModules,
    bool loadingSearchModules,
    String searchModulesError
  }) {
    AuthState state = new AuthState(
        firebaseUser ??= this.firebaseUser,

        token ??= this.token,

        contracts ??= this.contracts,
        loadingContracts ??= this.loadingContracts,
        contractsError ??= this.contractsError,

        searchModules ??= this.searchModules,
        loadingSearchModules ??= this.loadingSearchModules,
        searchModulesError ??= this.searchModulesError
    );

我正在使用Redux,因此每次调度动作时都需要创建一个新状态。

当我使用??而不提供参数时,该值将设置为null,因此这不是我想要的。 如果我使用??=,它会将对象的属性分配给新值。 但是当我将参数显式设置为null时,它无法将值设置为null。

我现在正在解决这个问题几天。如果有人可以帮助我会很棒。

顺便说一句,我正在使用https://github.com/alexeieleusis/greencat构建一个Flutter应用程序作为Redux库。

1 个答案:

答案 0 :(得分:1)

Dart没有提供一种方法来区分null是否明确地传递给可选参数,或者根本没有传递任何参数。

您可以使用类似

的内容
AuthState.copy({A a = someDummyValue /* other parameters}) {
  AuthState state = new AuthState(
    a == someDummyValue ? this.a : a,
    /* similar for other parameters */
  )

必须在某处定义someDummyValue,如

static const someDummyValue = const A.dummy();

仅当A中的所有字段均为final时才有效,否则您必须找到另一种方法来制作唯一someDummyValue

我建议使用built_value包为构建器和序列化器生成不可变类的代码。