在https://docs.flutter.dev/cookbook/navigation/navigate-with-arguments中,从route获取参数的首选方法是:
ModalRoute.of(context)!.settings.arguments;但是,由于它需要context参数,所以必须在build方法中调用它:
Widget build(BuildContext context) {
String id = ModalRoute.of(context)!.settings.arguments as String;
var data = httpGet(id);
return Scaffold(
//...
);
}这意味着每次重新构建小部件时,都会重新获取路由参数,可能还会重新获取另一个网络调用。
显而易见的解决方案是在某个地方有一个类似于boolean的wasFetched,并在build方法中添加一个条件。
大多数人都在做后者吗?
编辑:
基于第一个回复be @miguel-ruivo,我了解到context实际上可以作为State对象上的一个属性访问,因此可以从initState访问。
最后,我走进了兔子洞,发现我可以从didChangeDependencies调用它,而不需要使用来自WidgetsBindings.instance的addPostFrameCallback。
根据:https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html
上面写着:
这个方法也是在initState之后立即调用的。从这种方法调用BuildContext.dependOnInheritedWidgetOfExactType是安全的。
有些子类确实覆盖此方法,因为当依赖项发生变化时,它们需要执行一些昂贵的工作(例如,网络获取),而且对于每个构建来说,这种工作太昂贵了。
因为它说dependOnInheritedWidgetOfExactType打电话是安全的,这就意味着任何依赖BuildContext的东西都是安全的。
现在我把代码放进去了:
didChangeDependencies() {
String id = ModalRoute.of(context)!.settings.arguments as String;
//do http
}发布于 2021-11-24 10:35:20
实际上,您可以在context方法中访问initState,而不必将它作为参数传递。
class _YourScreenState extends State<YourScreen> {
late String? id;
@override
void initState() {
super.initState();
id = ModalRoute.of(context)!.settings.arguments as String?;
}
}https://stackoverflow.com/questions/70094482
复制相似问题