Flutter中弹框有很多方式,pub.dev也有很多库,但是总感觉比较重,不是很优雅。自己动手,丰衣足食。
题外说一句,笔者一直觉得轮子很好用,但是要适度,不能全部依靠轮子,对于好的库可以阅读源码,学习怎样解决问题、封装逻辑、代码编写规范等。所以笔者在GitHub上面基本都是些demo,并没有将代码上传到cocoapod
或pub.dev
。一方面也是因为笔者的技术有限,另外为的就是希望让一些开发者们在阅读后可以得到一些启发,从而自定义属于自己的东西。而且笔者一般上传的demo都很浅显易懂,也没有高度封装,对初学者很友好。
一直很敬佩那些分享优秀库的开发者,向他们致敬!Respect !!!
RCFlutterToast
言归正传,直接上运行截图:

使用Toast首先需要一个context
来显示,这个context
可以自行设置一个全局的context
(设置全局参数或GlobalKey
),也可以在需要显示的地方传入当前的context
。可在_internal()
的时候初始化传入,只需传入一次就可。
提示框分两种:显示后自动消失和显示需要手动消失。
显示结束后自动消失
一般的提示类的,比如请求失败、支付成功等这类提示信息,显示结束后会自动消失。
使用方法:void _autoRemove(Widget child,String text,{BuildContext context}){}
其中
child
为自定义的widget
text
为显示的文字,需要根据显示的text来计算显示的时间
context
为承载显示的context,可选。
显示结束后手动消失
一般用与加载的loading,消失时间无法确定,需要开发者手动处理。比如网络请求,在请求中显示loading;请求成功或失败的时候,结束显示,并作出对应的逻辑处理。
使用方法void _handMovementRemove(Widget child,{BuildContext context}){}
其中参数同上
把OverlayEntry
方法做了简单的抽取,注释也很清楚。
void _setOverlayEntry(Widget child,BuildContext context){
// 建议在_internal()初始化的时候,传入一次就可
if(context == null){
context = RCGlobalKey.currentState.context;
}
if (context == null)
throw ("Error: Context is null, Please call init(context) before showing toast.");
if(_overlayEntry == null){
_overlayEntry = OverlayEntry(
builder: (BuildContext context) => Positioned(
top: MediaQuery.of(context).padding.top + kToolbarHeight,
// Container大小设置。使在显示的时候,不影响导航条控制。也以便后面扩展更多功能(如:在显示弹框的时候,点击空白区域,弹框消失等各种操作)开发者可自行自定义扩展
child: Container(
alignment: Alignment.center,
color: Colors.transparent,
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height-kToolbarHeight - MediaQuery.of(context).padding.top,
padding: EdgeInsets.only(bottom: kToolbarHeight + MediaQuery.of(context).padding.top),
child: child,
),
)
);
//插入到整个布局的最上层
Overlay.of(context).insert(_overlayEntry);
}else{
//重新绘制UI,类似setState,为了消失的时候添加一个简单动画
_overlayEntry.markNeedsBuild();
}
}
Toast的思路就差不多是这样的,还是很简单的,开发者自行扩展应该可以满足大部分的需求了。
网友评论