flutter_easy_refresh icon indicating copy to clipboard operation
flutter_easy_refresh copied to clipboard

当EasyRefresh里面存在其他含ScrollController的widget时,其他Controller调用animateTo会导致EasyRefresh的IndicatorMode状态重置

Open gdmec07120836 opened this issue 1 year ago • 1 comments

先看效果 https://github.com/xuelongqy/flutter_easy_refresh/assets/6902443/edccc6c3-fa6e-48dd-b3ff-337b50a5bcdf

可以看到黄色的tab切换之后下拉刷新CupertinoHeader消失了,调试发现是_offset:0.0,IndicatorMode的状态变成了IndicatorMode.inactive log 再进一步调试发现是Swiper开了自动切换,里面的TransformerPageController调用了animateTo,导致EasyRefresh的ScrollPhysics也被回调了,重新检测了滑动边界。 关键代码: Swiper切换Ui的时候这里的短点也会执行 easy代码

大佬可以去试一下。 easy_refresh: 3.4.0 card_swiper: 3.0.1 用其他Controller应该也是这个效果,我懒得重新写就直接用这个widget了

gdmec07120836 avatar Jul 03 '24 11:07 gdmec07120836

测试代码忘了贴:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:card_swiper/card_swiper.dart';

class TestData{
  String name;
  TestData({required this.name});
}

class EasyRefreshTest extends StatefulWidget {
  const EasyRefreshTest({super.key});

  @override
  State<EasyRefreshTest> createState() => _EasyRefreshTestState();
}

class _EasyRefreshTestState extends State<EasyRefreshTest> {
  EasyRefreshController _refreshController = EasyRefreshController();
  List<TestData> list = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("EasyRefresh"),
      ),
      body: EasyRefresh(
        controller: _refreshController,
        refreshOnStart: true,
        header: CupertinoHeader(
            position: IndicatorPosition.locator,
            userWaterDrop: false,
            triggerOffset: 10
        ),
        footer: CupertinoFooter(position: IndicatorPosition.locator),
        onRefresh: (){
          requestData();
        },
        onLoad: (){
          requestData();
        },
        child: CustomScrollView(
          // controller: widget.viewModel.scrollController,
          slivers: [
            HeaderLocator.sliver(
              clearExtent: false,
            ),
            SliverList(
                delegate: SliverChildBuilderDelegate(
                      (BuildContext context, int index) {
                        if(index == 0){
                          return getSwiper();
                        }
                    return Container(
                      width: 100,
                      height: 60,
                      alignment: Alignment.center,
                      color: Colors.green,
                      child: Text("list-item-$index"),
                    );
                  },
                  childCount: list.length,
                )),
            FooterLocator.sliver(
              clearExtent: false,
            ),
          ],
        ),
      ),
    );
  }
  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }

  void requestData() async {
    await simulateDelay(Duration(seconds: 2));
    setState(() {

    });
  }

  Future<List<TestData>> simulateDelay(Duration duration) {
    final completer = Completer<List<TestData>>();

    Timer(duration, () {
      list.clear();
      for(int i = 0;i<20;i++){
        list.add(TestData(name: "测试一下i=$i"));
      }
      completer.complete(list); // 完成 Future
    });

    return completer.future;
  }

  Widget getSwiper(){
    return Container(
      width: 100,
      height: 100,
      child: RepaintBoundary(
        child: Swiper(
          index: 0,
          itemCount: 3,
          autoplay: true,
          key: UniqueKey(),
          loop: true,
          scrollDirection: Axis.horizontal,
          autoplayDisableOnInteraction: true,
          scale: 1,
          viewportFraction: 1.0,
          itemBuilder: (BuildContext context, int index) {
            return Container(
              width: 100,
              height: 100,
              alignment: Alignment.center,
              color: Colors.yellow,
              child: Text("item-$index"),
            );
          },
        ),
      ),
    );
  }
}


gdmec07120836 avatar Jul 03 '24 11:07 gdmec07120836

README第一条,看文档很重要

xuelongqy avatar Jul 20 '24 14:07 xuelongqy

没错,设置作用域就行了,感谢!!!

gdmec07120836 avatar Aug 07 '24 09:08 gdmec07120836

没错,设置作用域就行了,感谢!!!

@gdmec07120836 请问一下这个是在哪设置?我也没在README文档中找到,感谢!

Katzeee avatar Apr 10 '25 02:04 Katzeee

@Katzeee 抱歉,没回来看 文档在这里,具体用法就是在item套上这个ScrollConfiguration Image 类似这样

Image

class CustomScrollBehavior extends ScrollBehavior { CustomScrollBehavior();

@override ScrollPhysics getScrollPhysics(BuildContext context) { return ClampingScrollPhysics(); }

@override Widget buildViewportChrome(BuildContext context, Widget child, AxisDirection axisDirection) { return child; } }

gdmec07120836 avatar Jun 06 '25 09:06 gdmec07120836