flutter_easy_refresh icon indicating copy to clipboard operation
flutter_easy_refresh copied to clipboard

使用 NestedScrollViewPage 时controller.callRefresh(); 无法触发刷新

Open CodeGather opened this issue 2 years ago • 0 comments

在demo的基础上加切换tab时刷新页面使用 callRefresh 无法达到效果 以及使用refreshOnStart 页面有达到预期效果

import 'dart:async';

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

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

  @override
  NestedScrollViewPageState createState() {
    return NestedScrollViewPageState();
  }
}

class NestedScrollViewPageState extends State<NestedScrollViewPage>
    with SingleTickerProviderStateMixin {
  late EasyRefreshController _controller;
  late TabController _tabController;
  int _tabIndex = 0;
  int _listCount = 20;
  int _gridCount = 30;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 2, vsync: this);

    _controller = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

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

  @override
  Widget build(BuildContext context) {
    final themeData = Theme.of(context);
    return Scaffold(
      body: ExtendedNestedScrollView(
        onlyOneScrollInBody: true,
        pinnedHeaderSliverHeightBuilder: () {
          return MediaQuery.of(context).padding.top + kToolbarHeight;
        },
        headerSliverBuilder: (context, innerBoxIsScrolled) {
          return <Widget>[
            SliverAppBar(
              expandedHeight: 120,
              pinned: true,
              flexibleSpace: FlexibleSpaceBar(
                title: Text(
                  'NestedScrollView',
                  style: TextStyle(
                      color: Theme.of(context).textTheme.titleLarge?.color),
                ),
                centerTitle: false,
              ),
            ),
          ];
        },
        body: Column(
          children: <Widget>[
            TabBar(
              controller: _tabController,
              labelColor: themeData.colorScheme.primary,
              indicatorColor: themeData.colorScheme.primary,
              onTap: (index) {
                setState(() {
                  _tabIndex = index;
                });

                _controller.callRefresh();
              },
              tabs: const <Widget>[
                Tab(
                  text: 'List',
                ),
                Tab(
                  text: 'Grid',
                ),
              ],
            ),
            Expanded(
              child: IndexedStack(
                index: _tabIndex,
                children: <Widget>[
                  ExtendedVisibilityDetector(
                    uniqueKey: const Key('Tab0'),
                    child: EasyRefresh(
                      controller: _controller,
                      header: ClassicHeader(
                        dragText: 'Pull to refresh'.tr,
                        armedText: 'Release ready'.tr,
                        readyText: 'Refreshing...'.tr,
                        processingText: 'Refreshing...'.tr,
                        processedText: 'Succeeded'.tr,
                        noMoreText: 'No more'.tr,
                        failedText: 'Failed'.tr,
                        messageText: 'Last updated at %T'.tr,
                        safeArea: false,
                      ),
                      footer: ClassicFooter(
                        position: IndicatorPosition.locator,
                        dragText: 'Pull to load'.tr,
                        armedText: 'Release ready'.tr,
                        readyText: 'Loading...'.tr,
                        processingText: 'Loading...'.tr,
                        processedText: 'Succeeded'.tr,
                        noMoreText: 'No more'.tr,
                        failedText: 'Failed'.tr,
                        messageText: 'Last updated at %T'.tr,
                      ),
                      child: CustomScrollView(
                        slivers: [
                          SliverList(
                              delegate:
                                  SliverChildBuilderDelegate((context, index) {
                            return const SkeletonItem();
                          }, childCount: _listCount)),
                          const FooterLocator.sliver(),
                        ],
                      ),
                      onRefresh: () async {
                        await Future.delayed(const Duration(seconds: 2), () {
                          if (mounted) {
                            setState(() {
                              _listCount = 20;
                            });
                          }
                        });
                      },
                      onLoad: () async {
                        await Future.delayed(const Duration(seconds: 2), () {
                          if (mounted) {
                            setState(() {
                              _listCount += 10;
                            });
                          }
                        });
                      },
                    ),
                  ),
                  ExtendedVisibilityDetector(
                    uniqueKey: const Key('Tab1'),
                    child: EasyRefresh(
                      header: ClassicHeader(
                        dragText: 'Pull to refresh'.tr,
                        armedText: 'Release ready'.tr,
                        readyText: 'Refreshing...'.tr,
                        processingText: 'Refreshing...'.tr,
                        processedText: 'Succeeded'.tr,
                        noMoreText: 'No more'.tr,
                        failedText: 'Failed'.tr,
                        messageText: 'Last updated at %T'.tr,
                        safeArea: false,
                      ),
                      footer: ClassicFooter(
                        position: IndicatorPosition.locator,
                        dragText: 'Pull to load'.tr,
                        armedText: 'Release ready'.tr,
                        readyText: 'Loading...'.tr,
                        processingText: 'Loading...'.tr,
                        processedText: 'Succeeded'.tr,
                        noMoreText: 'No more'.tr,
                        failedText: 'Failed'.tr,
                        messageText: 'Last updated at %T'.tr,
                      ),
                      child: CustomScrollView(
                        slivers: [
                          SliverGrid(
                              delegate:
                                  SliverChildBuilderDelegate((context, index) {
                                return const SkeletonItem(
                                  direction: Axis.horizontal,
                                );
                              }, childCount: _gridCount),
                              gridDelegate:
                                  const SliverGridDelegateWithFixedCrossAxisCount(
                                crossAxisCount: 2,
                                childAspectRatio: 6 / 7,
                              )),
                          const FooterLocator.sliver(),
                        ],
                      ),
                      onRefresh: () async {
                        await Future.delayed(const Duration(seconds: 2), () {
                          if (mounted) {
                            setState(() {
                              _gridCount = 30;
                            });
                          }
                        });
                      },
                      onLoad: () async {
                        await Future.delayed(const Duration(seconds: 2), () {
                          if (mounted) {
                            setState(() {
                              _gridCount += 10;
                            });
                          }
                        });
                      },
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

CodeGather avatar Sep 02 '22 05:09 CodeGather