of static method

查找包含给定上下文的最接近的 TxExpansionPanel 实例的 TxExpansionPanelController

如果没有 TxExpansionPanel 包含给定的上下文,则调用此方法将导致在调试模式下断言,并在 发布模式下引发异常。

若要返回 null,如果没有 TxExpansionPanel,请改用 maybeOf

{@tool dartpad} TxExpansionPanelController.of 函数的典型用法是从 TxExpansionPanel 的后代的“ build”方法中调用它。

TxExpansionPanel 实际上是在与引用控制器的回调相同的“build”函数中创建的,则 “build”函数的“context”参数不能用于查找 TxExpansionPanelController(因为它位于小 部件树中返回的小部件的“上方”)。在这种情况下,您可以添加一个 Builder 小部件,它提供 了一个新范围,其中包含位于 TxExpansionPanel 下的 BuildContext

** 请参阅 examples/api/lib/material/expansion_tile/expansion_tile.1.dart 中的代码 ** {@end-tool}

更有效的解决方案是将构建函数拆分为多个小部件。这引入了一个新的上下文,您可以从中获取 TxExpansionPanelController。使用这种方法,您将拥有一个外部小组件,用于创建由新内部 小组件的实例填充的 TxExpansionPanel,然后在这些内部小组件中使用 TxExpansionPanelController.of

Implementation

static TxExpansionPanelController of(BuildContext context) {
  final _ExpansionTileState? result =
      context.findAncestorStateOfType<_ExpansionTileState>();
  if (result != null) {
    return result._tileController;
  }
  throw FlutterError.fromParts(<DiagnosticsNode>[
    ErrorSummary(
      'TxExpansionPanelController.of() 使用不包含 TxExpansionPanel 的上下文调用。',
    ),
    ErrorDescription(
      '从传递给 TxExpansionPanelController.of() 的上下文开始,找不到 TxExpansionPanel 祖先。'
      '当提供的上下文与其构建函数实际创建所查找的 TxExpansionPanel 小部件的上下文来自同一 '
      'StatefulWidget 时,通常会发生这种情况。',
    ),
    ErrorHint(
      '有几种方法可以避免此问题。最简单的方法是使用 Builder 来获取位于 TxExpansionPanel '
      '下的上下文。有关此示例,请参阅 TxExpansionPanelController.of() 的文档:\n'
      '  https://api.flutter.dev/flutter/material/TxExpansionPanel/of.html',
    ),
    ErrorHint(
      '更有效的解决方案是将构建函数拆分为多个小部件。这将引入一个新的上下文,您可以从中获取 '
      'TxExpansionPanel。在此解决方案中,您将有一个外部小部件,用于创建由新的内部小部件的'
      '实例填充的 TxExpansionPanel,然后在这些内部小部件中,您将使用 '
      'TxExpansionPanelController.of()。\n '
      '另一种解决方案是将 GlobalKey 分配给 TxExpansionPanel,然后使用 key.currentState '
      '属性获取 TxExpansionPanel,而不是使用 TxExpansionPanelController.of() 函数。',
    ),
    context.describeElement('使用的上下文是'),
  ]);
}