Flutter在initState()初始化方法时使用包含context的Widget导致报错问题

先上报错信息

dependOnInheritedWidgetOfExactType<_InheritedTheme>() or dependOnInheritedElement() was called before _AddArticleState.initState() completed. When an inherited widget changes, for example if the value of Theme.of() changes, its dependent widgets are rebuilt. If the dependent widget’s reference to the inherited widget is in a constructor or an initState() method, then the rebuilt dependent widget will not reflect the changes in the inherited widget. Typically references to inherited widgets should occur in widget build() methods. Alternatively initialization based on inherited widgets can be placed in the didChangeDependencies method, which is called after initState and whenever the dependencies change thereafter.

错误原因

我这里主要是因为在initState方法的时候初始化了一个widget数组,而这个widget数组当中使用了包含context的东西,所以在页面并没有初始化完成之前,context是没有的,所以就会导致这个问题。

解决办法

使用WidgetsBinding.instance.addPostFrameCallbac方法,检测当页面build完成之后,再去调用自己的东西,来解决这个问题,当然还有另外一种解决办法,之前我也写过文章,不想用这个的,也可以换这个:Flutter初始化路由页面时自动弹出提示框

WidgetsBinding.instance.addPostFrameCallback((_){
   print('--------------页面buildOver-------------------');
   // 初始化Widget
   _initWidget();
   // 调用请求接口
   _getData();
   // 弹出dialog
   _dialog();
 });

最后记得在你的方法里setState来改变内容

要让一个 Flutter widget 从透明度 0 渐显,你可以使用 `AnimatedOpacity` widget。这个 widget 允许你在一段间内改变子 widget 的透明度。下面是一个示例代码: ```dart class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> with SingleTickerProviderStateMixin { AnimationController _controller; Animation<double> _opacityAnimation; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: Duration(seconds: 1), // 动画的持续间 ); _opacityAnimation = Tween<double>(begin: 0.0, end: 1.0).animate(_controller); _controller.forward(); // 开始动画 } @override void dispose() { _controller.dispose(); // 记得释放动画控制器 super.dispose(); } @override Widget build(BuildContext context) { return AnimatedOpacity( opacity: _opacityAnimation.value, // 使用动画的值作为透明度 duration: Duration(seconds: 1), // 动画的持续间 child: YourChildWidget(), // 要渐显的子 widget ); } } ``` 在上面的示例中,我们创建了一个继承自 `StatefulWidget` 的 `MyWidget`,并在 `initState` 方法初始化了一个动画控制器 `_controller` 和一个透明度动画 `_opacityAnimation`。然后,在 `build` 方法中,我们将 `AnimatedOpacity` 作为根 widget,通过设置 `opacity` 属性来控制子 widget 的透明度。最后,在 `initState` 方法中我们调用了 `_controller.forward()` 来开始动画。 这样,你就可以实现一个 widget 从透明度 0 渐显的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值