美文网首页
flutter学习之mixin抽离监听滚动

flutter学习之mixin抽离监听滚动

作者: 这代码不好写 | 来源:发表于2020-09-03 17:17 被阅读0次

    做记录使用大概没得啥博客价值,直接丢代码

    import 'package:common_utils/common_utils.dart';
    import 'package:flutter/cupertino.dart';
    
    /// 提出滚动组件ScrollController滚动计算出显示与隐藏
    /// @param 
    /// @return 
    /// @author 
    /// created at 2020/8/19 15:21
    ///
    @optionalTypeArgs
    mixin ScrollCalculatedAttributesClientMixin{
    
      ///滚动最大值做出反应
      @protected
      double get scrollOffsetMax;
    
      ///滚动为负数时是否停止一切操作
      @protected
      bool  get OffsetNegative;
    
      ///滚动旧数据
      double _oldScrollOffset = 0.0;
      double get oldScrollOffset => _oldScrollOffset;
    
      bool _isStay = true;
    
    ///
    /// @param offset [实时滚动高度]
    /// @param dynamicHeight [动态高度,需手动传入] | 可选参数
    /// @return  true | false 根据返回值更新数据
    /// @author 
    /// created at 2020/8/19 11:43
    ///
      bool setScrollReaction(double offset,[double dynamicHeight]){
        double _scrollOffsetMax = scrollOffsetMax;
        bool _OffsetNegative = OffsetNegative;
    //    print("滚动高度 = $offset");
    //    print("历史高度 = $_oldScrollOffset");
        if(ObjectUtil.isEmpty(scrollOffsetMax)) _scrollOffsetMax = 20.0;
        if(ObjectUtil.isNotEmpty(dynamicHeight)) _scrollOffsetMax = dynamicHeight;
        if(ObjectUtil.isEmpty(OffsetNegative)) _OffsetNegative = true;
        ///判断 负数后停止操作 & 滚动高度为负数
        if(_OffsetNegative && offset.isNegative){
          _isStay = true;
          _oldScrollOffset = 0.0;
        }else{
          if(offset - _oldScrollOffset >= _scrollOffsetMax){
            _oldScrollOffset = offset;
            _isStay = false;
          }
          if(_oldScrollOffset - offset  >= _scrollOffsetMax){
            _isStay = true;
            _oldScrollOffset = offset;
          }
        }
        return _isStay;
      }
    
    }
    
    
    

    注意事项

    使用ScrollController控制器,放在需要滚动的组件上

    在initState里面监听

    scrollController.addListener(() {
    //     _scrollController.position.pixels 获取当前滚动部件滚动的距离
    //     当滚动距离大于 单位一屏之后,显示回到顶部按钮
    //scrollController.position.pixels(滚动距离)
    });
    

    如果滚动的最大距离(scrollOffsetMax)是变量的 则需要手动传入,常量就不需要了

    记录原由

    首次发现mixin挺好用的写了个样例

    之后逐渐发现使用mixin结合rxdart做数据请求也挺好用的(简单页面仅仅单次请求)

    个人github博客转载18487115313.github.io

    相关文章

      网友评论

          本文标题:flutter学习之mixin抽离监听滚动

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