前言
最近忙了一段时间,没有记录Flutter开发过程中遇到的问题,今天抽点时间做个总结,记录一下开发经验!
开发过程遇到的
1、当使用textfileld编辑时,点击空白处,如何收起键盘?
使用GestureDetector组件包裹视图,在onTap点击方法里添加:
FocusScope.of(context).requestFocus(FocusNode());
2、CupertinoActionSheet和showCupertinoModalPopup
iOS风格的底部弹框组件,CupertinoActionSheetAction是CupertinoActionSheet的子组件,也可自定义子组件,配合showCupertinoModalPopup实现底部弹框。
3、OffStage组件
控制子组件是否展示,offStage为true时隐藏,false时展示,可保持页面状态,单个页面有多个tab切换页面时可用,但加载时,所有子页面一次性全部加载,开销比较大。推荐使用PageView+ AutomaticKeepAliveClientMixin。
4、IndexedStack组件
继承自Stack组件,可以堆叠子视图,通过index控制子视图的展示,与OffStage类似。
5、InkWell组件
InkWell组件提供水波纹点击效果,可自定义实现独特的点击效果。
6、父组件如何调用子组件的方法?
如果子组件是StatelessWidget,父组件调用子组件方法很简单,直接使用子组件类名调用其内部定义的方法即可。如果子组件是StatefulWidget,子组件方法定义在State里,那么如何调用呢?
class ChildView extends StatefulWidget {
ChildView({
Key? key,
}) : super(key: key);
@override
State createState() {
return IbsImageStateState();
}
}
class ChildViewState extends State< ChildView > {
@override
Widget build(BuildContext context) {
return Container();
}
void publicMethod() {
//子组件内实现方法...
}
}
在父组件就可以定义
final GlobalKey<ChildViewState> _stateKey = new GlobalKey<ChildViewState>();
将_stateKey作为ChildView的key值,就可以通过:
_stateKey.currentState!. publicMethod();
调用到子组件内部定义的方法。
注意:
ChildViewState
不能定义为_ChildViewState
,否则父组件里定义GlobalKey将获取不到ChildViewState,在Flutter里,加了下划线默认是私有的方法或者属性,外部无法获取到。
7、Row、Column、Expanded和Container组件使用问题
1、如果要实现Text组件换行,可在Text组件外面嵌套一层Expanded组件,但若将Expanded组件外面嵌套一层Container组件时,换行就没效果,布局还是会溢出报错;
2、若Expanded组件直接作为Column的children子组件时,布局会报错,需要在Expanded组件嵌套一层Row组件。
后语
以上就时开发过程中遇到的问题,如有错误请指正,共勉!