首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过BuildContext获取路由参数需要将其放入build()中?

通过BuildContext获取路由参数需要将其放入build()中?
EN

Stack Overflow用户
提问于 2021-11-24 10:30:14
回答 2查看 247关注 0票数 3

https://docs.flutter.dev/cookbook/navigation/navigate-with-arguments中,从route获取参数的首选方法是:

代码语言:javascript
运行
复制
ModalRoute.of(context)!.settings.arguments;

但是,由于它需要context参数,所以必须在build方法中调用它:

代码语言:javascript
运行
复制
Widget build(BuildContext context) {
  String id = ModalRoute.of(context)!.settings.arguments as String;
  var data = httpGet(id);
  return Scaffold(
    //...
  );
}

这意味着每次重新构建小部件时,都会重新获取路由参数,可能还会重新获取另一个网络调用。

显而易见的解决方案是在某个地方有一个类似于booleanwasFetched,并在build方法中添加一个条件。

大多数人都在做后者吗?

编辑:

基于第一个回复be @miguel-ruivo,我了解到context实际上可以作为State对象上的一个属性访问,因此可以从initState访问。

最后,我走进了兔子洞,发现我可以从didChangeDependencies调用它,而不需要使用来自WidgetsBindings.instanceaddPostFrameCallback

根据:https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html

上面写着:

这个方法也是在initState之后立即调用的。从这种方法调用BuildContext.dependOnInheritedWidgetOfExactType是安全的。

有些子类确实覆盖此方法,因为当依赖项发生变化时,它们需要执行一些昂贵的工作(例如,网络获取),而且对于每个构建来说,这种工作太昂贵了。

因为它说dependOnInheritedWidgetOfExactType打电话是安全的,这就意味着任何依赖BuildContext的东西都是安全的。

现在我把代码放进去了:

代码语言:javascript
运行
复制
didChangeDependencies() {
  String id = ModalRoute.of(context)!.settings.arguments as String;
  //do http
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-24 10:34:26

您只能在每个小部件初始化时调用它一次,方法是将它移动到您的initState()并安排一个post帧,这样它只能在呈现后访问BuildContext

代码语言:javascript
运行
复制
@override
void initState() {
    WidgetsBinding.instance.addPostFrameCallback(() {
      String id = ModalRoute.of(context)!.settings.arguments as String;
      var data = httpGet(id);
    });
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-24 10:35:20

实际上,您可以在context方法中访问initState,而不必将它作为参数传递。

代码语言:javascript
运行
复制
class _YourScreenState extends State<YourScreen> {
 late String? id;

 @override
 void initState() {
   super.initState();
   id = ModalRoute.of(context)!.settings.arguments as String?;
 }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70094482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档