前言
今天写Demo时,用showModalBottomSheet,添加点击事件调用setState()
方法后,UI依然不更新,百度了一下,从这两个文章找到了对应的解决方案:
Flutter showDialog/showModalBottomSheet刷新UI
showModalBottomSheet setState 无法更新UI问题
解决方案
解决方案用:StatefulBuilder
包裹一下方可。代码如下:
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25), topRight: Radius.circular(25))),
context: context,
builder: (_) {
return StatefulBuilder(builder: (context, state) {
return InkWell(
onTap: () {
state(() {
///update your UI
});
},
child: Container());
});
});
代码讲解
StatefulBuilder(builder: (context, state)
如果有需要UI更新的,需要先用StatefulBuilder
包裹一下- 当需要更新时,调用
state(() { ///update your UI });
代替setState()
的方法
原理
首先理解showModalBottomSheet
,本质上可以理解为路由入栈
,在show之后弹出的页面其实是另一个页面
了,此时再setState刷新的其实是原页面的状态
,所以在此方法的builder方法中先返回一个StatefulBuilder
,设置其setState方法为state,此时再调用此方法便可做到刷新状态
。