浮动窗口小部件中的缓存堆栈跟踪

时间:2019-12-04 23:49:00

标签: flutter dart future

我正在使用自己的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。

所以我不明白如何实现上述声明:

字段必须为最终字段,字段的成员不必为必填字段。

您如何解决此问题?

0 个答案:

没有答案