我正在使用自己的FutureBuilder版本,称为FutureBuilderEx。
当未来引发异常时,stacktrace本质上是无用的,因为它仅显示来自微任务的堆栈,而不是从构建小部件的位置显示的堆栈。
为了改善诸如FutureBuilderEx之类的堆栈跟踪,我想在将来引发异常时重新创建一个人工堆栈跟踪。
为此,我创建了一个StackTraceImpl类,该类可以让我操作堆栈跟踪。
https://gist.github.com/bsutton/75c3335f39438b4a24b96b0d9b2a5398
构造窗口小部件时,我将存储当前的堆栈跟踪,然后,如果将来引发异常,我将获取存储的堆栈跟踪,并将其与将来的堆栈跟踪合并,以创建伪堆栈跟踪。
伪堆栈跟踪将使程序员可以轻松地找到异常的来源。
问题在于,窗口小部件要求所有字段均为final,这意味着我无法在窗口小部件ctor期间实例化堆栈跟踪。
我看过类似的声明:
一个不可变的class字段必须是final,而该字段的成员不必是final。
我有一个Ref类,它允许间接访问第二类:
class Ref<T> {
T _wrapped;
const Ref.empty();
Ref(T obj) : _wrapped = obj;
T get obj => _wrapped;
set obj(T obj) {
_wrapped = obj;
}
bool get isNotEmpty => obj != null;
bool get isEmpty => obj == null;
}
我希望在FutureBuilderEx中使用ref类作为最终类,但是只允许字段初始化程序调用常量。
所以我想我将创建上面的Ref.empty()ctor,但是当然必须是const,这意味着Ref类的所有字段都必须是const。
所以我不明白如何实现上述声明:
字段必须为最终字段,字段的成员不必为必填字段。
您如何解决此问题?