flutter - 如何控制来自提供者的对话?
问题描述
我对 Flutter 很陌生。我正在尝试学习 Dart 语法和 Flutter 结构和约定。这很有趣。我是 JS 开发人员,react,react native,node.js 基础。所以,我想我已经习惯了声明式的结构和设计。
我正在使用提供程序构建一个小型玩具项目。大多数全局变量和状态都处于全局状态并提供给整个应用程序。实际上,我的一个问题是打开一个对话框。我知道如何用showDialog()
方法打开一个对话框。但是,我想按提供者的状态打开它。例如。提供程序中的 isOpenCustomDialog 状态。
Widget build(BuildContext context) {
var isOpenCustomDialog = Provider.of<Store>(context).isOpenCustomDialog;
// it throws error
if(isOpenCustomDialog) showDialog( ... )
return ...
}
我尝试了几种方法,但没有任何收获,我想知道为此目的的最佳约定是什么。
解决方案
在方法构建中打开对话框或调用函数不是一个好习惯。那是因为 Flutter 可以随时重建,一个或多个 setState 都会触发副作用。对您而言,一种可能更简单、更实用的方法是直接从您的提供程序类中调用您的对话框,因为您依赖于一个状态。你可以通过将你的上下文发送到你的类来做到这一点(我认为这是一个丑陋的解决方案),或者只是使用这个包,它允许你从代码中的任何地方打开对话框,因为你不需要上下文。
因此,在您的 Store 类中,您可以使用以下内容:
Get.dialog(SimpleAlertDialog());
但是,如果您只是想消除此错误,也许观看构造结束调用对话框也可以帮助您:
Widget build(BuildContext context) {
SchedulerBinding.instance.addPostFrameCallback((_) {
if(isOpenCustomDialog) showDialog( ... )
});
推荐阅读
- visual-studio - 如何在不打开外部浏览器实例的情况下在 Visual Studio 中查看代码文档?
- android - 是否可以与 android studio 模拟器上的模拟设备共享本地目录
- android - 如何使用 ChatSDK 对 Firebase 用户进行身份验证?
- ios - 辅助功能 屏幕阅读器在 iPhone X 上有不同的行为
- javascript - 将数组元素分组为 n 组
- javascript - 物化输入字段密码错误标签firefox
- php - 在 PHP 中读取 Socket,只接收 Trash
- java - clone() 方法(浅拷贝或深拷贝)
- javascript - 在 VR 模式下,teleport-controls 在 Aframe 0.8.2 下不起作用
- javascript - jQuery:如果字段为空或未选中复选框,则禁用提交按钮