xuelongqy / flutter_easy_refresh

A flutter widget that provides pull-down refresh and pull-up load.
https://xuelongqy.github.io/flutter_easy_refresh/
MIT License
3.84k stars 628 forks source link

当ScrollView中存在其他ScrollView在滚动时(例如:列表中存在自动轮播图在轮播),header无法回弹。 #757

Closed oshiwei closed 10 months ago

oshiwei commented 10 months ago

你好,目前我在使用easy_refresh时,经常出现刷新header无法回弹收起的情况,怀疑是列表中存在自动轮播导致的,修改了example中的carousel_page.dart测试,也存在同样的问题,能帮忙一起查看一下吗? 以下是我修改后的代码:

import 'package:carousel_slider/carousel_slider.dart';
import 'package:example/widget/skeleton_item.dart';
import 'package:flutter/material.dart';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:get/get.dart';

class CarouselPage extends StatefulWidget {
  const CarouselPage({Key? key}) : super(key: key);

  @override
  State<CarouselPage> createState() => _CarouselPageState();
}

class _CarouselPageState extends State<CarouselPage> {
  int _count = 10;
  int _carouselCount = 5;
  late EasyRefreshController _controller;

  @override
  void initState() {
    super.initState();
    _controller = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final themeData = Theme.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('Carousel example'.tr),
      ),
      body: EasyRefresh(
        controller: _controller,
        onRefresh: () async {
          await Future.delayed(const Duration(seconds: 2));
          if (!mounted) {
            return;
          }
          setState(() {
            _count = 10;
          });
          _controller.finishRefresh();
          _controller.resetFooter();
        },
        onLoad: () async {
          await Future.delayed(const Duration(seconds: 2));
          if (!mounted) {
            return;
          }
          setState(() {
            _count += 5;
          });
          _controller.finishLoad(
              _count >= 20 ? IndicatorResult.noMore : IndicatorResult.success);
        },
        triggerAxis: Axis.vertical,
        child: CustomScrollView(
          slivers: [
            SliverToBoxAdapter(
              child: CarouselSlider(
                options: CarouselOptions(
                  height: 180.0,
                  viewportFraction: 1,
                  enableInfiniteScroll: false,
                  autoPlay: true,
                  autoPlayInterval: Duration(seconds: 2),
                ),
                items: [
                  for (int i = 0; i < _carouselCount; i++)
                    Card(
                      elevation: 0,
                      color: themeData.colorScheme.surfaceVariant,
                      child: Center(
                        child: Text((i + 1).toString()),
                      ),
                    ),
                ],
              ),
            ),
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (context, index) {
                  return const SkeletonItem();
                },
                childCount: _count,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

只有build中的代码修改过,设置了EasyRefresh的triggerAxis: Axis.vertical,删除了CarouselSlider上的EasyRefresh,为了更好的复现,将轮播时间设置为2s:autoPlayInterval: Duration(seconds: 2) Simulator Screen Recording - iPhone 14 - 2023-09-04 at 15 41 50

xuelongqy commented 10 months ago

Readme第一条

oshiwei commented 10 months ago

Readme第一条

非常感谢!我也非常惭愧,看了readme第一条的代码,但没认真理解文字的含义。