Build image\u picker Cancel:Navigation.pop在用于flatter的小部件生成器中

Build image\u picker Cancel:Navigation.pop在用于flatter的小部件生成器中,build,flutter,widget,picker,navigator,Build,Flutter,Widget,Picker,Navigator,我的颤振应用程序中存在以下问题: 要使image_picker Cancel按钮正常工作,我需要能够在用户按下菜单中的Cancel按钮时导航.pop 此image_picker-Cancel问题的主要问题是:如何在小部件的构建器中导航回Navigator.popcontext 以下内容引发了一个错误: 小部件_cancelBtnPressedWidgetBuildContext上下文{ Navigator.popcontext; } 我知道小部件应该返回一些东西。因此,是否有可能伪返回一些东西-

我的颤振应用程序中存在以下问题:

要使image_picker Cancel按钮正常工作,我需要能够在用户按下菜单中的Cancel按钮时导航.pop

此image_picker-Cancel问题的主要问题是:如何在小部件的构建器中导航回Navigator.popcontext

以下内容引发了一个错误:

小部件_cancelBtnPressedWidgetBuildContext上下文{ Navigator.popcontext; } 我知道小部件应该返回一些东西。因此,是否有可能伪返回一些东西-但实际上保持Navigator.pop作为小部件内的主要操作???最好是在没有额外用户交互的情况下自动调用

根据上述代码,错误为:

颤振:══╡ 动画库捕获到异常╞═════════════════════════════════════════════════════════ 颤振:在通知AnimationController的状态侦听器时引发了以下断言: 颤振:在生成期间调用setState或markNeedsBuild。 颤振:这个覆盖小部件不能被标记为需要构建,因为框架已经在 颤振:构建小部件的过程。小部件可以标记为需要在构建阶段构建 颤振:只有当它的祖先之一正在建造时。此异常是允许的,因为框架 颤振:在子部件之前构建父部件,这意味着将始终构建脏的子部件。 颤振:否则,框架可能不会在构建阶段访问此小部件。 颤振:调用setState或markNeedsBuild的小部件是: 颤振:叠加-[LabeledGlobalKeyb5c98]状态:叠加状态6A872入口: 颤振:[Overlayentryd1e7不透明:false;保持状态:false,Overlayentry43b81不透明:false; 颤振:保持状态:真,覆盖入口0B49不透明:假;保持状态:假, 颤振:overlayentryb9362不透明:false;保持状态:true] 颤振:当发出违规呼叫时,当前正在构建的小部件是: 颤振:FutureBuilderdirty,状态:_FutureBuilderStated3cac

以下是对上述要求来源的更详细说明:

事实上,我想在用户按下cancel按钮时立即使用Navigator.pop作为用法

我意识到snapshot.hashCode-change是检测用户按下取消按钮的一种方法。因此,如果用户按下“取消”按钮,我只想导航。返回我的来源;。。。我不想再显示或将用户保留在小部件中,而是立即返回到最初Navigate.push的视图

下面是图像选择器部分,它执行图像查找和取消处理,即调用_cancelBtnPressedWidget-Widget

进口“包装:颤振/材料.省道”; 导入“dart:io”; 导入“包:image_picker/image_picker.dart”; 文件imageFile; bool_pickImage=true; int_hashy=0; @凌驾 小部件构建上下文上下文{ 如果选取图像{ 回归未来建设者 future:ImagePicker.pickImagesource:ImageSource.camera, 生成器:构建上下文上下文,异步快照快照{ 如果snapshot.hasData{ _pickImage=false; _imageFile=snapshot.data; 返回_showImagesnapshot.data; }否则{ //按“取消”时,哈希代码将更改。。。 如果hashy!=0&&snapshot.hashCode!=\u hashy{ //当按下取消键时 返回_cancelBtnPressedWidgetcontext; } _hashy=snapshot.hashCode; 返回脚手架 正文:中 子项:文本“没有可用的图像选择器”, , ; } }, ; }否则{ 返回_showImage_imageFile; } } 小部件_cancelBtnPressedWidgetBuildContext上下文{ //需要退货……如何克服这一要求???? Navigator.popcontext; } 小部件\u showImageFile imgFile{ 返回脚手架 正文:安全区 子:堆栈 对齐:AlignmentDirective.topStart, 儿童:[ 定位 左:0.0, 底部:0.0, 宽度:MediaQuery.ofcontext.size.width, 高度:MediaQuery.ofcontext.size.height, 儿童:中心 子项:imgFile==null ?文本“未选择图像” :Image.fileimgFile, , , //更多的堆栈…在这里不重要。。。。 ], , , ; } 当然,在pubspec.yaml中添加了必要的依赖项:

依赖项: 颤振: sdk:颤振 图像选取器:^0.5.0+3 附加内容:

我试图添加一个确认对话框,即询问用户你真的想取消吗 l

现在,上述错误消失了。但是,现在图像选择器不断弹出…覆盖此对话框

我还在对她做什么

小部件_cancelBtnPressedWidgetBuildContext上下文{ 返回警报对话框 标题:文本“摄像头警报”, 内容:文本“您确定要取消吗?”, 行动:[ 扁平按钮 子:文本“关闭”, 按下按钮:{ Navigator.popcontext; }, ], ; }
在我看来,你根本没有抓住点击的机会。对我来说,我会在“取消按键”窗口和“按下通话”窗口中返回一个按钮。

我终于找到了答案:

事实上,我能够放置一个确认对话框,并且在那里我能够放置必要的返回小部件

现在,图像选择器的“取消”按预期工作

以下是完整的代码:

进口“包装:颤振/材料.省道”; 导入“dart:io”; 导入“包:image_picker/image_picker.dart”; 类MyImagePickerView扩展StatefulWidget{ _MyImagePickerViewState createState=>\u MyImagePickerViewState; } 类_MyImagePickerViewState扩展状态{ 文件imageFile; bool_pickImage=true; int_hashy=0; bool _cancelPressed=false; @凌驾 小部件构建上下文上下文{ 如果选取图像{ 回归未来建设者 future:ImagePicker.pickImagesource:ImageSource.camera, 生成器:构建上下文上下文,异步快照快照{ 如果snapshot.hasData{ _pickImage=false; _imageFile=snapshot.data; 返回_showImagesnapshot.data; }否则{ //按“取消”时,哈希代码将更改。。。 如果hashy!=0&&snapshot.hashCode!=\u hashy{ //当按下取消键时 返回_cancelBtnPressedWidgetcontext; } _hashy=snapshot.hashCode; 返回脚手架 正文:中 子项:文本“没有可用的图像选择器”, , ; } }, ; }否则{ 如果按了取消键{ 返回-显示警报; }否则{ 返回_showImage_imageFile; } } } 小部件_cancelBtnPressedWidgetBuildContext上下文{ _cancelPressed=true; _pickImage=false; 返回脚手架 正文:中 子项:文本“按下按钮开始”, , ; } 小部件\u showImageFile imgFile{ StateContainerState container=StateContainer.ofcontext; 返回脚手架 正文:安全区 子:堆栈 对齐:AlignmentDirective.topStart, 儿童:[ 定位 左:0.0, 底部:0.0, 宽度:MediaQuery.ofcontext.size.width, 高度:MediaQuery.ofcontext.size.height, 儿童:中心 子项:imgFile==null ?文本“未选择图像” :Image.fileimgFile, , , //更多的堆栈…在这里不重要。。。。 ], , , ; } Widget\u showAlert{ 返回警报对话框 标题:文本“摄像头警报”, 内容:文本“您确定要取消相机吗?”, 行动:[ 扁平按钮 儿童:文本“否”, 按下按钮:{ 设定状态{ _pickImage=true; _cancelPressed=false; }; }, , 扁平按钮 孩子:文本“是”, 按下按钮:{ Navigator.popcontext; }, , ], ; } @凌驾 无效处置{ _myController.dispose; 超级处理; } }
嗯,我不想让用户点击两次。i、 e.我想取消按钮是本机插件的一部分,因此我想退出这个小部件,而不添加其他按钮。然而,您的回答让我想到,我可以添加一些确认对话框,在那里我可以使用onPressed事件。让我试试……我在原始问题的底部添加了确认对话框的想法。但是,它仍然无法工作,因为此图像选择器一直覆盖对话框。i、 e.对话框只出现一小段时间,然后被摄像头插件覆盖后再次消失。我还能做些什么来保持对话框在视图的顶部?谢谢你的任何提示…啊,我明白了,我对那个插件不是很熟悉。但也许可以试试这个?