Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在无状态widget的任意函数中获取上下文?_Flutter_Statelesswidget_Flutter Alertdialog - Fatal编程技术网

Flutter 如何在无状态widget的任意函数中获取上下文?

Flutter 如何在无状态widget的任意函数中获取上下文?,flutter,statelesswidget,flutter-alertdialog,Flutter,Statelesswidget,Flutter Alertdialog,我们希望在一些异步处理(如网络进程)之后显示AlertDialog 从外部类调用“showartelectdialog()”时,我希望在没有上下文的情况下调用它。有好办法吗 class SplashPage extends StatelessWidget implements SplashView { BuildContext _context; @override Widget build(BuildContext context) { this._context = co

我们希望在一些异步处理(如网络进程)之后显示AlertDialog

从外部类调用“showartelectdialog()”时,我希望在没有上下文的情况下调用它。有好办法吗

class SplashPage extends StatelessWidget implements SplashView {
  BuildContext _context;
  @override
  Widget build(BuildContext context) {
    this._context = context;
    ...
  }
我已经考虑过上述方法,但我担心一些次要问题

帮助

我当前的代码
class SplashPage扩展了SplashView{
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:MyStoreColors.eats\u white1\u ffffff,
正文:中(
子级:新SvgPicture.asset('assets/ic_splash.svg'),
),
);
}
@凌驾
void showAlertDialog(){
显示对话框(
上下文:/*如何获取上下文?*/,,
生成器:(BuildContext上下文){
返回警报对话框(
标题:文本(“无库存”),
内容:常量文本(“此项不再可用”),
行动:[
扁平按钮(
子项:文本('Ok'),
已按下:(){
Navigator.of(context.pop();
},
),
],
);
},
);
}
@凌驾
void moveToHomeContainer(){
}
@凌驾
void moveToLoginContainer(){
}
}

异步事件完成后,您应该触发重建,或者将小部件转换为
StatefulWidget
并调用
setState()
,或者使用类似Bloc的状态管理解决方案

例如,使用
StatefulWidget
您的代码如下所示:

class SplashPage extends StatefulWidget {
  @override
  State<SplashPage> createState() => _SplashPageState();
}

class _SplashPageState extends State<SplashPage> implements SplashView {

  bool _asynOpDone = false;

  /// Call this when the async operation is done.
  void _onAsynOpDone() => setState(() => _asyncOpDone = true);

  @override
  Widget build(BuildContext context) {
    if (_asyncOpDone) showAlertDialog(context);

    return Scaffold(
      ...,
      ///
    );
  }

  @override
  void showAlertDialog(BuildContext context) {
    showDialog<void>(
      context: context,
      builder: ...,
    );
  }
}
class SplashPage扩展StatefulWidget{
@凌驾
State createState()=>\u SplashPageState();
}
类_SplashPageState扩展状态实现SplashView{
bool _asynOpDone=false;
///异步操作完成后调用此函数。
void _onAsynOpDone()=>setState(()=>_asyncOpDone=true);
@凌驾
小部件构建(构建上下文){
如果(_asyncOpDone)显示警报对话框(上下文);
返回脚手架(
...,
///
);
}
@凌驾
void showAlertDialog(构建上下文){
显示对话框(
上下文:上下文,
建筑商:。。。,
);
}
}

要显示AlertDialog,您需要上下文,但在无状态Widget中,您不能像在StatefulWidget中那样直接访问它

以下几种选择是:

  • 将其作为GlobalKey传递
  • 将构建上下文作为参数传递给无状态小部件中的任何其他函数
  • 使用服务在没有上下文的情况下插入对话框

干杯。

您将在哪里使用
showAlertDialog
?您可以将
上下文
作为参数传递是的,为什么不使用
showAlertDialog(BuildContext上下文)
?我尝试使用类似于MVP的体系结构。在此页面中,我想在视图绑定到演示者时检查应用程序版本。我想将有关版本检查的错误消息输出到演示者中的
view.showartDialog()
。您是说在
build()
中调用
presenter.checkAppVersion(context)
?此页面是一个只有一个图像视图的介绍屏幕。构建视图后,不需要重新构建视图。顺便问一下,我应该使用StatefulWidget来打开AlertDialog吗?我想还有另外一个好办法。
class SplashPage extends StatefulWidget {
  @override
  State<SplashPage> createState() => _SplashPageState();
}

class _SplashPageState extends State<SplashPage> implements SplashView {

  bool _asynOpDone = false;

  /// Call this when the async operation is done.
  void _onAsynOpDone() => setState(() => _asyncOpDone = true);

  @override
  Widget build(BuildContext context) {
    if (_asyncOpDone) showAlertDialog(context);

    return Scaffold(
      ...,
      ///
    );
  }

  @override
  void showAlertDialog(BuildContext context) {
    showDialog<void>(
      context: context,
      builder: ...,
    );
  }
}