常量表达式依赖于自身。 Dart 循环依赖

问题描述 投票:0回答:2

我正在开发一个生成 dart 代码的工具,但在执行具有循环依赖性的程序时遇到了这个运行时错误。

file.dart:xx:xx: Error: Constant evaluation error:
    this.b = const B(),,
                   ^
file:xx:xx: Context: Constant expression depends on itself.
    this. A = const A(),

这是我正在执行的程序的简化:

class A {
  final B b;
  const A({
    this.b = const B(),
  });
}

class B {
  final A a;
  const B({
    this.a = const A(),
  });
}

如您所见,A 和 B 之间存在循环依赖。

我尝试将 const 关键字删除为:

class A {
  final B b;
  A({
    this.b = B(),
  });
}

class B {
  final A a;
  B({
    this.a = A(),
  });
}

但是,我得到了一个编译时错误:

The default value of an optional parameter must be constant. dart(non_constant_default_value)

你知道如何处理这类问题吗?或者 Dart 中是否有等价于 forwardref 的东西?

flutter dart code-generation circular-dependency circular-reference
2个回答
1
投票

你的方法是行不通的,因为当你构造

A()
时,它会构造一个
B()
,它会构造
A()
,它会构造
B()
,无穷无尽。

如果您希望

A
的单个实例和
B
的单个实例相互引用,您需要让它们中的一个传递对自身的引用,而不是让另一个构造函数创建一个新的实例初始类型。你不能在初始化列表中传递
this
this
在那个时候还无效
),所以它必须在构造函数体中完成,并且初始化的
final
成员需要是
late 
.构造函数体也意味着两个类都不能有
const
构造函数。

如果你想要

const
构造函数,因为你想要
A()
B()
作为默认参数,典型的方法是使用
null
作为默认参数
.

class A {
  late final B b;
  A({B? b}) {
    this.b = b ?? B(a: this);
  }
}

class B {
  late final A a;
  B({A? a}) {
    this.a = a ?? A(b: this);
  }
}

0
投票

使用工厂构造函数怎么样?

class A {
  final B b;
  
  factory A() => A._(B());
  
  A._(this.b);
}

class B {
  final A a;
  
  factory B() => B._(A());
  
  B._(this.a);
}
© www.soinside.com 2019 - 2024. All rights reserved.