fluttercandies / extended_nested_scroll_view

extended nested scroll view to fix following issues. 1.pinned sliver header issue 2.inner scrollables in tabview sync issue 3.pull to refresh is not work. 4.do without ScrollController in NestedScrollView's body
MIT License
591 stars 117 forks source link

使用flutter_easyrefresh进行刷新,相当于ExtendNestedScrollView里嵌套CustomScrollView出现滑动冲突 #87

Closed houziruinb87 closed 2 years ago

houziruinb87 commented 2 years ago

您好,目前下拉刷新和加载更多,我们目前是用的这个库:https://github.com/xuelongqy/flutter_easyrefresh

里边有一个专门处理NestedScrollView的代码如下。 但是这个库使用的咱们的extended_nested_scroll_view里边代码不是最新版的,比如:NestedScrollViewInnerScrollPositionKeyWidget这些代码已经找不到了。

现在我们的项目里需要使用多个TabView中使用刷新和加载更多的操作。 也看了您提供的加载更多和下拉刷新。但是我们项目如果迁移第三方库要改的东西太多,您能提供一下如何通过flutter_easyrefresh这个库进行刷新和加载更多么。

简单看了一下flutter_easyrefresh这个的源码,是使用CustomScrollView,咱们NestedScrollView里如果嵌套CustomScrollView就会出现滑动冲突的问题。 我现在布局是这样嵌套的: ExtendedNestedScrollView: body: Column(TabBar+Expanded(TabView)) 其中的TabView:EasyRefresh.custom

期待您的回复!感谢。

`import 'dart:async';

import 'package:example/widget/sample_list_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart' as extended;

/// NestedScrollView示例页面 class NestedScrollViewPage extends StatefulWidget { @override NestedScrollViewPageState createState() { return NestedScrollViewPageState(); } }

class NestedScrollViewPageState extends State with SingleTickerProviderStateMixin { // Tab控制器 late TabController _tabController; int _tabIndex = 0; // 列表 int _listCount = 20; // 表格 int _gridCount = 30;

// 初始化 @override void initState() { super.initState(); _tabController = TabController(length: 2, vsync: this); }

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

@override Widget build(BuildContext context) { return Scaffold( body: extended.NestedScrollView( pinnedHeaderSliverHeightBuilder: () { return MediaQuery.of(context).padding.top + kToolbarHeight; }, innerScrollPositionKeyBuilder: () { if (_tabController.index == 0) { return Key('Tab0'); } else { return Key('Tab1'); } }, headerSliverBuilder: (context, innerBoxIsScrolled) { return [ new SliverAppBar( title: Text("NestedScrollView"), centerTitle: true, expandedHeight: 190.0, flexibleSpace: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: Container(), ), floating: false, pinned: true, ), ]; }, body: Column( children: [ PreferredSize( child: new Card( color: Theme.of(context).primaryColor, elevation: 0.0, margin: new EdgeInsets.all(0.0), shape: new RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(0.0)), ), child: new TabBar( controller: _tabController, onTap: (index) { setState(() { _tabIndex = index; }); }, tabs: [ new Tab( text: 'List', ), new Tab( text: 'Grid', ), ], ), ), preferredSize: new Size(double.infinity, 46.0), ), Expanded( child: IndexedStack( index: _tabIndex, children: [ extended.NestedScrollViewInnerScrollPositionKeyWidget( Key('Tab0'), EasyRefresh( child: ListView.builder( padding: EdgeInsets.all(0.0), itemBuilder: (context, index) { return SampleListItem(); }, itemCount: _listCount, ), onRefresh: () async { await Future.delayed(Duration(seconds: 2), () { if (mounted) { setState(() { _listCount = 20; }); } }); }, onLoad: () async { await Future.delayed(Duration(seconds: 2), () { if (mounted) { setState(() { _listCount += 10; }); } }); }, ), ), extended.NestedScrollViewInnerScrollPositionKeyWidget( Key('Tab1'), EasyRefresh( child: GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 6 / 7, ), itemBuilder: (context, index) { return SampleListItem( direction: Axis.horizontal, ); }, itemCount: _gridCount, ), onRefresh: () async { await Future.delayed(Duration(seconds: 2), () { if (mounted) { setState(() { _gridCount = 30; }); } }); }, onLoad: () async { await Future.delayed(Duration(seconds: 2), () { if (mounted) { setState(() { _gridCount += 10; }); } }); }, ), ), ], ), ), ], ), ), ); } } `

houziruinb87 commented 2 years ago

竟然没再复现,不知道为啥。。。