Flutter 如何在父窗口小部件内使用Navigator.of(context)';s回调函数?

Flutter 如何在父窗口小部件内使用Navigator.of(context)';s回调函数?,flutter,Flutter,我不太熟悉颤振,但我来自棱角分明的背景。在Angular中,渲染组件时通常使用父/子组件模式。在这种情况下,您将让父组件响应子组件发出的事件,然后执行一些逻辑。例如,您可以有一个名为Dashboard的父组件,并且在仪表板内部可以有一个按钮组件。单击此按钮组件时,它将发出一个事件。父级将侦听此事件,并在发出新事件时作出反应,例如更改路由 我的理解是,flatter有一个类似的概念,您可以在父“小部件”中处理您的逻辑。我试图实现的是有一个父窗口小部件,我们称之为LandingPage,该窗口小部件

我不太熟悉颤振,但我来自棱角分明的背景。在Angular中,渲染组件时通常使用父/子组件模式。在这种情况下,您将让父组件响应子组件发出的事件,然后执行一些逻辑。例如,您可以有一个名为
Dashboard
的父组件,并且在仪表板内部可以有一个按钮组件。单击此按钮组件时,它将发出一个事件。父级将侦听此事件,并在发出新事件时作出反应,例如更改路由

我的理解是,flatter有一个类似的概念,您可以在父“小部件”中处理您的逻辑。我试图实现的是有一个父窗口小部件,我们称之为
LandingPage
,该窗口小部件将呈现两个按钮窗口小部件,我希望将回调函数传递给按钮窗口小部件,并在按下按钮时更改父窗口小部件中的路径。我将按钮小部件提取到我的应用程序特定小部件中,以消除代码重复:

主按钮.省道

class PrimaryButton extends StatelessWidget {
  PrimaryButton({@required this.buttonText, this.onPressedCallback ,this.width: 300.0});  
  final String buttonText;
  final double width;
  final VoidCallback onPressedCallback;

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 50.0,
      child: RaisedButton(
        elevation: 8.0,
        onPressed: () => this.onPressedCallback,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
        padding: EdgeInsets.all(0.0),
        child: ... (removed for brevity)
      ),
    );
  }
}
对于
主按钮.dart
小部件,我希望传入任何返回void的回调函数(类似于angular的事件发射器)。如上面的代码所示

在父组件中,我有以下内容:
登录页.省道

class LandingPage extends StatelessWidget {

void onLoadHomePage(BuildContext context){
    Navigator.of(context).push(...)
  }

 @override
  Widget build(BuildContext context) {
  return Scaffold(...
   PrimaryButton(buttonText: "Hello world", onPressedCallback: this.onLoadHomePage(context))
  );
 }

}
当然,上述方法不起作用,因为主按钮没有准备好接受回调签名中包含上下文的回调,加上
Navigator(context)
期望使用上下文。传递
BuildContext
感觉这是一种错误的做法,即使我必须在父窗口小部件和子窗口小部件之间传递
BuildContext
,我也无法让它正常工作。这似乎合理,对吗?或者这是对这些无状态小部件的错误思考


如果我只是将
primary button.dart
的内容复制到
登录页.dart
小部件和内部
onPressed
回调使用
Navigator.of(context)
一切正常。但我觉得我不应该这么做

如果我没有误解的话,主要的问题是如何使
onPressedCallback
函数工作

我认为您不需要传输
上下文
参数,请尝试以下方法:

类登录页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(。。。
主按钮(
buttonText:“你好,世界”,
onPressedCallback:(){
此.onload主页(上下文);
},
),
);
}
}

然后,
onLoadHomePage
函数可以访问
上下文
参数本身。

但是主按钮小部件实际上不可重用。按下时,它将始终执行“onLoadHoePage”。另外,如果“主按钮”小部件应该位于单独的dart文件中,并且可以重复使用,那么您如何访问“this.onLoadHomePage”。这有意义吗?感谢您的回复为什么不能重复使用?我的代码在
登录页面
类中,将
(){this.onLoadHomePage(context);}
传递到
主按钮
类。如果您想在其他地方使用PrimaryButton,只需根据需要传入另一个回调函数。我会把我的答案修改得更清楚。哦,我现在明白你的意思了。嗯,这就是我要找的。今晚我将进行测试,如果有效,我将接受答案。非常感谢!