美文网首页Flutter
Flutter之Toast详解

Flutter之Toast详解

作者: HuyaRC | 来源:发表于2021-01-11 10:17 被阅读0次

Flutter中弹框有很多方式,pub.dev也有很多库,但是总感觉比较重,不是很优雅。自己动手,丰衣足食。


题外说一句,笔者一直觉得轮子很好用,但是要适度,不能全部依靠轮子,对于好的库可以阅读源码,学习怎样解决问题、封装逻辑、代码编写规范等。所以笔者在GitHub上面基本都是些demo,并没有将代码上传到cocoapodpub.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的思路就差不多是这样的,还是很简单的,开发者自行扩展应该可以满足大部分的需求了。

个人浅见,有误的地方欢迎指正

相关文章

网友评论

    本文标题:Flutter之Toast详解

    本文链接:https://www.haomeiwen.com/subject/hnhfaktx.html