美文网首页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