flutter - 设置上下文变量
问题描述
我的许多函数都在内部使用上下文,因为它们使用了snackbar。我将它们保存在一个单独的文件中。
创建变量 BuildContext currentContext 并在每个屏幕中覆盖它是一个好主意吗?这些函数将更具可读性,而无需每次都将上下文参数传递给每个函数,它们将使用 currenntContext 代替
解决方案
创建变量 BuildContext currentContext 并在每个屏幕中覆盖它是一个好主意吗?
不
如果可以做到这一点,那么如果您或您团队中的某个人忘记设置变量一次,您认为会发生什么?应用程序崩溃的最坏情况,但我相信它只会失去功能
拥有全局变量通常不是一个好主意,因为它会导致难以跟踪代码,因为使用相同的参数运行相同的函数不一定会产生相同的结果。
以上对于上下文来说是双重正确的,因为您可以访问上下文的一个原因是您将它传递给您正在使用的函数,以便他们可以确定您的小部件树的外观。
基本上,这是不好的做法,我知道这并不意味着很多,但是好的做法是好的做法,坏的做法是坏的做法是有原因的。
有可能吗?
经过一番测试,我得出的结论是,可以按照您的要求进行操作。
唯一需要注意的是全局上下文的值包含一个脚手架,这听起来很明显,但很容易忘记:
Widget build(BuildContext context) {
ContextProvider.globalContext = context;
return Scaffold(...);
}
上面的代码将不起作用,因为在分配上下文时,小部件树上没有脚手架,如果您在 上分配全局上下文,它也将不起作用initState
,您必须执行以下操作:
Widget build(BuildContext context) {
return Scaffold(
body: Builder(builder: (context) {
ContextProvider.globalContext = context;
return ...
}),
);
}
或类似的东西。
我还没有测试使用来自有状态小部件的上下文设置全局上下文,它可以在任何地方访问它更新的上下文,所以也许值得尝试一下,以将自己从即将陷入的构建者地狱中拯救出来?
推荐阅读
- javascript - 使用 !important 属性删除 CSS 规则
- javascript - 事件侦听器未应用
- php - 在 Blade 视图中保留前导零
- r - 使用 dplyr 返回匹配的值
- laravel - Laravel - 使用资源发布到外部 API?
- c# - 如何使用 Polly 停止发布到 TPL 管道的大量工作
- python - 对 Python 中的每个系数都有特定约束的 Lasso 回归
- here-api - 崩溃:nma_deice_log_size_bytes
- selenium - selenium webdriver 选择下拉值
- java - 使用 ADF 弹出窗口提交和导航时出错