Design patterns 自定义小部件的回调中没有上下文

Design patterns 自定义小部件的回调中没有上下文,design-patterns,flutter,callback,Design Patterns,Flutter,Callback,我是个新手,所以这很容易被比我更有经验的人回答。与其说是代码问题,不如说是设计问题 有时,我想编写可重用的小部件,并使它们具有某种通用性,我想对用户输入进行回调,以便父小部件可以订阅,然后采取适当的操作,而不是硬编码路由等。但是,如果我想从回调中导航,我会直接遇到麻烦,因为那时我没有上下文。那么,我如何在flatter中设计它呢?在无状态小部件中,始终可以有一个可选/必需的上下文参数。对于有状态的小部件,上下文通常是可用的,但如果出于某种原因需要父上下文,则始终可以将其传递给小部件。看看下面的例

我是个新手,所以这很容易被比我更有经验的人回答。与其说是代码问题,不如说是设计问题


有时,我想编写可重用的小部件,并使它们具有某种通用性,我想对用户输入进行回调,以便父小部件可以订阅,然后采取适当的操作,而不是硬编码路由等。但是,如果我想从回调中导航,我会直接遇到麻烦,因为那时我没有上下文。那么,我如何在flatter中设计它呢?

在无状态小部件中,始终可以有一个可选/必需的上下文参数。对于有状态的小部件,上下文通常是可用的,但如果出于某种原因需要父上下文,则始终可以将其传递给小部件。看看下面的例子

class GenericWidgetFoo extends StatelessWidget {
  final BuildContext context;
  final Key key;
  final String name;

  const GenericWidgetFoo(
      {this.key, @required this.context, @required this.name});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Center(
          child: Text(
        this.name,
        style: TextStyle(
          color: Theme.of(context).primaryColorLight,
        ),
      )),
    );
  }
}

正如psink上面所说,我只是忽略了扩展状态类实际上可以访问上下文的事实:

性质

上下文→ 构建上下文 树中此小部件生成的位置。[...]
只读

在callbackso中传递上下文您是否扩展了
StatefulWidget
?如果是,请阅读
状态
类属性您可以传递
上下文
。如果您显示一些代码会更好。好的,我认为上下文对于树中的每个小部件都是本地的,您不应该使用父级的上下文(但只能从构建函数接收)。因为我读到了一些关于上下文的内容,这些内容有特定小部件的约束和大小,所以我认为传递它可能是危险的。你不必在小部件中保存上下文:请参阅我的第一条评论