Giter VIP home page Giter VIP logo

flutter_pulltorefresh's People

Contributors

bassel avatar clarekang avatar davemcelf avatar fzyzcjy avatar gustav0ar avatar ivanvishnevskiy avatar kounex avatar lijy91 avatar liwendeng avatar lucke0051 avatar meketiuk avatar peng8350 avatar pinboro avatar rudolfvonkrugstein avatar rururezu avatar sjroesink avatar thearaks avatar tiagorochattw avatar yrom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_pulltorefresh's Issues

Compatibility with ListView

I'm using the version 1.2.0 and when I try to assign the ListView as Child of the SmartRefresher it says that the ListView is not type ScrollView.

From the example written in the README is instead shown that I'm doing correctly.

How can implement that?

Sorry, it may be a simple trick but I'm new to Flutter. :)

如何监听滚动的位置变化?

你好,如何监听滚动的位置变化?我想在向下滚动一段距离后显示回到顶部的按钮,回到顶部后隐藏按钮,需要知道位置的变化

Compatibility with CupertinoPageScaffold

I have a CupertinoPageScaffold that contain a CupertinoNavigationBar and the ListView with the SmartRefresher on it.

It seems that the ListView has some major layout issue when contained outside the Material Scaffold, and this makes the SmartRefresher hard to be implemented without it.

Is there a way to use the CupertinoPageScaffold with the SmartRefresher? Or maybe I'm doing something wrong?

在SmartRefresher组件在Build前调用refreshController。其中headerMode和footMode都为null

@OverRide
void initState() {
// TODO: implement initState
super.initState();

_refreshController = new RefreshController();

loadData();

}

Future loadData() async {
try {
//获取数据
}
setState(() {
//什么都不做,只为触发RefreshIndicator的子控件刷新
});
_refreshController.sendBack(false, RefreshStatus.idle);
} catch (e) {
_refreshController.sendBack(false, RefreshStatus.failed);
}
}

@OverRide
Widget build(BuildContext context) {
if(netData.length == 0){
// 加载菊花
return CupertinoActivityIndicator();
}else{
return new SmartRefresher(
controller: _refreshController,
onRefresh: _onRefresh,
onOffsetChange: _onOffsetCallback,
child: buildListView(),
);
}
}

当我在initState函数里面实例化controller的时候,这个时候发送一个网络请求获取数据。这个时候bulid函数还未调用。此时我调用 _refreshController.sendBack(false, RefreshStatus.idle);去更新当前的状态就会报这个错:

Tried calling: value=4
#0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1 RefreshController.sendBack (package:pull_to_refresh/src/smart_refresher.dart:385:19)
#2 _RecommendedPageState.loadData (package:QGCodeFlutter/home/recommendedpage.dart:94:26)

#3 _RecommendedPageState.initState (package:QGCodeFlutter/home/recommendedpage.dart:30:5)
#4 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3830:58)
#5 ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
#6 Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
#7 Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
#8 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4860:14)
#9 Element.inflateWidget (package:flu<…>
[VERBOSE-2:shell.cc(184)] Dart Error: Unhandled exception:
NoSuchMethodError: The setter 'value=' was called on null.

原因是:RefreshController这个类里面的
ValueNotifier _headerMode;
ValueNotifier _footerMode;
ScrollController scrollController;
全部都为null。
这个地方是否可以优化一下???

内层 listview 无法使用 controller

SmartRefresher(
  controller: _refresh_controller,
  child: ListView.builder(
    controller: _list_controller

    ... // 在某个点击事件中使用 list controller 会报错
    onTap: () {
        print(_list_controller);
        _list_controller.animateTo(.0, Duration(seconds: 1), Curves.ease);
    }
  )
)

print 语句打印结果为:

ScrollController#4e01c(no clients)

如果去掉 SmartRefresher,打印结果类似为:

ScrollController#4e01c(one client, offset 3.3)

�报错信息:

I/flutter ( 7395): ══╡ EXCEPTION CAUGHT BY GESTURE ╞══
I/flutter ( 7395): The following assertion was thrown while handling a gesture:
I/flutter ( 7395): ScrollController not attached to any scroll views.
I/flutter ( 7395): 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 149 pos 12:
I/flutter ( 7395): '_positions.isNotEmpty'

Refresh Indicator still spinning at the end

After scolling to second page, the refresh indicator is still spinning. It looks like remote fetch is not hapening.

 ItemService.getItems(
        count: widget.count,
        lastKey: referenceToOldestKey,
      ).then((QuerySnapshot snapshot) {
        _refreshController.sendBack(true, RefreshStatus.completed);

        _refreshController.scrollTo(_refreshController.scrollController.offset + 120.0);

        items.addAll(snapshot.documents);

        if (mounted) {
          setState(() {});
        }
      }).catchError((onError) {
        _refreshController.sendBack(false, RefreshStatus.failed);
      });

issues with SliverPersistentHeader

当我在CustomScrollView中使用SliverPersistentHeader做吸顶效果时,如果是用了SmartRefresher且开启了下拉加载,SliverPersistentHeader的吸顶效果将会在屏幕外面

SliverPersistentHeader(
              pinned: true,
              floating: false,
              delegate: _SliverAppBarDelegate(
                minHeight: 88,
                maxHeight: 88,
                child: SelectView(),
              ),
            ),

正常吸顶效果如下:
825341a8-68e2-4c3e-952e-7a7b025cf4e4

当使用了SmartRefresher且开启了下拉加载之后如下:
3d24ac0e-e4d3-41e3-85e2-549d75605907

Suggest:可以考虑使用SliverPersistentHeader来实现下拉组件,可能会避免这个问题

无法保持ListView.builder在PageView切换时的Offset

我的业务当中采用PageView对页面进行左右切换。纯ListView.builder的情况下,通过下面的方式可以保持Offset状态,
`

ListView.builder(

key: PageStorageKey("list"),

controller: ScrollController(keepScrollOffset: true)

)

`

但只要将SmartRefresher引入进来,ListView便失去了保持Offset的能力。

我尝试去查看源码,发现SmartRefresher的ScrollController是私有属性。请问作者有没有能解决这样问题的思路呢?

上拉加载的bug

上拉加载网络请求数据回来后会多次触发上拉加载的网络请求

scrollview的controller被SmartRefresher替换的问题

SmartRefresher使用了新创建的_scrollController做scrollview offset的相关控制。
这会导致问题:#14
关联代码如下:

class _SmartRefresherState extends State<SmartRefresher> {
  ...
  void _init() {
    _scrollController = new ScrollController();
    ...
  }

  @override
  Widget build(BuildContext context) {
    ...
    return new LayoutBuilder(builder: (context, cons) {
      return new Stack(
        ...
                child: new CustomScrollView(
                  physics: new RefreshScrollPhysics(enableOverScroll: widget.enableOverScroll),
                  controller: _scrollController,
                  slivers:  slivers,
      ...
    );
  }

建议在scrollview有controller的时候,使用scrolview的controller而不用新创建。
即代码改为:

class _SmartRefresherState extends State<SmartRefresher> {
  ...
  void _init() {
    _scrollController = widget.child.controller ?? ScrollController();
    ...
  }

header 会显示出10dp。在没有刷新或者刷新结束后,header(loading 显示区域)会溢出到视觉范围。

在没有刷新或者刷新结束后,header(loading 显示区域)会溢出到视觉范围。
原因是default_height = 50, 而如果没有设置ClassicIndicator 里的height, height 默认为60.
SmartRefresher 在build 时候会将 ScrollView 上移 default_height。 那么视觉范围内就会有60 - 50 = 10 的大小区域。

解决这个问题:

  1. 将ClassicIndicator height 默认值改回50;
  2. 使用者每次使用的时候,设置height 为 50;

problem with Nested Scroll View

Hi guys,
SmartRefresher with SliverAppBar don't work.
the widget does not collapse, but I would like it to be like this:
image
is there a way to do it?
thanks

Custom RefreshStatus text

hi author, can i custom RefreshStatus text will be display to difference ?
ex: No more data -> empty data ?

刷新问题

数据量比较小时,比如有一到3个数据下拉刷新 会触发下拉刷新和加载更多 都同时触发了 下拉刷新的动画和上啦加载更多的动画都有展示 应该只展示下拉刷新才对

嵌套的ListView会误触发刷新操作

外层为垂直ListView,内层中有水平的ListView。
现在的情况是在左右滑动内层的 listview 的时候,也会导致触发下拉刷新,怎么禁用呢,没有看到控制的地方。

SmartRefresher(
    child: ListView.builder(
        itemBuilder: PageView.builder(...)  // 左右滑动这里的PageView,会触发刷新操作
    )
)

Not working with latest flutter... exception compiling

file:///Users/anton/flutter/.pub-cache/hosted/pub.dartlang.org/pull_to_refresh-1.1.5/lib/src/internals/indicator_wrap.dart:105:46: Error: The argument type
'(dart.core::Null) → dart.core::Null' can't be assigned to the parameter type '(void) → dynamic'.
Try changing the type of the parameter, or casting the argument to '(void) → dynamic'.
    _sizeController.animateTo(minSpace).then((Null val) {

flutter doctor:

[✓] Flutter (Channel master, v0.10.1-pre.72, on Mac OS X 10.13.6 17G65, locale en-US)
    • Flutter version 0.10.1-pre.72 at /Users/anton/flutter
    • Framework revision b95b67a66b (6 days ago), 2018-10-17 23:25:46 +0800
    • Engine revision 08272ee6aa
    • Dart version 2.1.0-dev.7.1.flutter-b99bcfd309

child view can not be Container

The child parameter can not be Container:

return new SmartRefresher(
        enablePullDown: true,
        enablePullUp: true,
        // refreshMode: this.refreshing,
        // loadMode: this.loading,
        onRefresh: _onRefresh,
        // headerBuilder: _buildHeader,
        // onOffsetChange: _onOffsetCallback,
        child: new Container(
            color: Colors.white,
            child: new Column(
              children: <Widget>[
                // headBannerSection,
                carouselBanner,
                _buildCategorySection(context),
                _buildListViewContent(),
              ],
            )));
  }

This gives an error.

Compatibility issue with flutter_sticky_header

First off, I just wanted to say that I really enjoy this plugin, thank you for your development effort!

I am having a bit of an issue getting it to work correctly with another plugin titled flutter_sticky_header: https://pub.dartlang.org/packages/flutter_sticky_header

It appears that the title is sticky-ing to a location that is hidden away. Quick example:

import 'package:flutter/material.dart';
import 'package:flutter_sticky_header/flutter_sticky_header.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';

class TestView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State<TestView> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          'Playground',
        ),
      ),
      body: SafeArea(
        child: SmartRefresher(
          child: CustomScrollView(
            slivers: <Widget>[
              SliverStickyHeader(
                header: Container(
                  padding: EdgeInsets.only(
                    left: 12.0,
                    top: 4.0,
                    right: 12.0,
                    bottom: 4.0,
                  ),
                  color: Colors.white,
                  child: Text(
                    'Title0',
                    style: TextStyle(
                      color: Colors.grey,
                      fontSize: 14.0,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                sliver: SliverList(
                  delegate: SliverChildListDelegate(
                    [
                      Container(
                        height: 200.0,
                        color: Colors.red,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.blue,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.red,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.blue,
                      ),
                    ],
                  ),
                ),
              ),
              SliverStickyHeader(
                header: Container(
                  padding: EdgeInsets.only(
                    left: 12.0,
                    top: 4.0,
                    right: 12.0,
                    bottom: 4.0,
                  ),
                  color: Colors.white,
                  child: Text(
                    'Title1',
                    style: TextStyle(
                      color: Colors.grey,
                      fontSize: 14.0,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                sliver: SliverList(
                  delegate: SliverChildListDelegate(
                    [
                      Container(
                        height: 200.0,
                        color: Colors.red,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.blue,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.red,
                      ),
                      Container(
                        height: 200.0,
                        color: Colors.blue,
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

I understand that this is not necessarily a bug with your package, I was just hoping to get some guidance.

Thank you for your time!

example4, loadmore 会触发多次,加载完成后 “加载中不消失”

环境如下
[✓] Flutter (Channel master, v0.7.0, on Mac OS X 10.12.6 16G29, locale zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK 28.0.0-rc1)
[!] iOS toolchain - develop for iOS devices (Xcode 9.2)
✗ libimobiledevice and ideviceinstaller are not installed. To install, run:
brew install --HEAD libimobiledevice
brew install ideviceinstaller
✗ ios-deploy not installed. To install:
brew install ios-deploy
! CocoaPods out of date (1.5.0 is recommended).
CocoaPods is used to retrieve the iOS platform side's plugin code that responds to your plugin usage on the Dart side.
Without resolving iOS dependencies with CocoaPods, plugins will not work on iOS.
For more info, see https://flutter.io/platform-plugins
To upgrade:
brew upgrade cocoapods
pod setup
[✓] Android Studio (version 2.3)
✗ Flutter plugin version 12.1 - the recommended minimum version is 16.0.0
[!] VS Code (version 1.26.1)
[✓] Connected devices (1 available)

example4加载更多有几个bug

! Doctor found issues in 2 categories.

如何才能让SliverAppBar里面的expandedHeight随着下拉而变大呢?

当在NestedScrollView中使用这个PACKAGE的时候,我不知道如何才能让SliverAppBar里面的expandedHeight随着下拉而变大。

也就是让flexibleSpace里面的图片随着下拉而增加高度。

现在手机QQ的QQ空间和TWITTER用户界面都有这样的效果。

求大神解答,跪谢。

我的代码如下:

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
      home: DetailsPage(),
    ));


class DetailsPage extends StatefulWidget {
  @override
  _DetailsPageState createState() => new _DetailsPageState();
}


class _DetailsPageState extends State<DetailsPage>
    with TickerProviderStateMixin {


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: NestedScrollView(
              //physics: RefreshScrollPhysics(),
              headerSliverBuilder:
                  (BuildContext context, bool innerBoxIsScrolled) {
                return <Widget>[
                  SliverAppBar(
                    backgroundColor: Colors.brown,
                    expandedHeight: 300.0,
                    floating: false,
                    pinned: true,
                    flexibleSpace: FlexibleSpaceBar(
                      
                      centerTitle: true,
                      background: Image.network("https://images.unsplash.com/photo-1541701494587-cb58502866ab?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=0c21b1ac3066ae4d354a3b2e0064c8be&auto=format&fit=crop&w=500&q=60",fit: BoxFit.cover,)
                    ),
                  ),
                  
                ];
              },
              body: new Container(
                color: Colors.cyan,

              ),
            ));
  }
}

初始化的时候header会闪一下

_headerHeight 默认是0 这时候header会显示在顶部,然后拿到了header的真实高度以后,才会给top赋值 隐藏到顶部~

建议:增加cacheExtent 配置功能

项目遇到一个问题:需要统计列表中的卡片曝光,但是发现CustomScrollView默认预加载不在可是范围内的卡片
建议:增加CustomScrollView中cacheExtent 的配置功能@peng8350
return new LayoutBuilder(builder: (context, cons) {
return new Stack(
children: [
new Positioned(
top: !widget.enablePullDown || widget.headerConfig is LoadConfig
? 0.0
: -(widget.headerConfig as RefreshConfig).height,
bottom: !widget.enablePullUp || widget.footerConfig is LoadConfig
? 0.0
: -(widget.footerConfig as RefreshConfig).height,
left: 0.0,
right: 0.0,
child: new NotificationListener(
child: new CustomScrollView(
physics: new RefreshScrollPhysics(
enableOverScroll: widget.enableOverScroll),
controller: _scrollController,
slivers: slivers,
cacheExtent: widget.cacheExtent,
),
onNotification: _dispatchScrollEvent,
)),
],
);

NoSuchMethodError: The setter 'value=' was called on null.

When I firstly call refreshController.sendBack in initState firstly, will throw NoSuchMethodError: The setter 'value=' was called on null.

As follows code:

abstract class BaseListState extends State<BaseListWidget>
    with AutomaticKeepAliveClientMixin<BaseListWidget> {
   RefreshController _refreshController = RefreshController();
   List data;

  @override
  void initState() {
    super.initState();
    _loadNew();
  }

  _loadNew() async {
    final remoteDate = await _loadData();
    if (mounted) {
      setState(() {
        data = remoteDate;
      });
      _refreshController.sendBack(true, RefreshStatus.completed);
      if (page == total) {
        _refreshController.sendBack(false, RefreshStatus.noMore);
      } else {
        _refreshController.sendBack(false, RefreshStatus.canRefresh);
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return data == null
        ? Center(child: CircularProgressIndicator())
        : SmartRefresher(
            controller: _refreshController,
            enablePullDown: true,
            enablePullUp: true,
            onRefresh: (up) {
              if (up) {
                _loadNew();
              } else {
                _loadMore();
              }
            },
            child: ListView.builder(
                itemCount: data == null ? 0 : data.length,
                itemBuilder: (context, index) {
                  return childBuild(context, index);
                }));
  }
}

Empty space between item and header.

Hey there,

First of all, thanks for the great library! Onto the issue...

There's an empty space between one of the items and the pull to refresh item.

Here's the demostration.

empty-space

上拉刷新问题

上拉加载更多的时候 如果手不放开,一直上拉,loading会一直转

RefreshIndicator shows forever

你好,

请问_controller.sendBack(false, event.status); 这里我设置了返回idle的status,但是RefreshIndicator仍然一直显示,可能是什么问题?大概是这样的:

new RefreshIndicator(
child: SmartRefresher(
controller: _controller,
enablePullDown: false,
enablePullUp: false,
enableOverScroll: false,
child: new ListView.builder(
itemCount: snapshot.data == null ? 0 : snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
MovieModel model = snapshot.data[index];
return new ReposItem(model);
},
),
),
onRefresh: () {
bloc.onRefresh(labelId: labelId);
},
),

上滑刷新Bug

当我上滑加载完数据后 调用 RefreshStatus.noMore 我下滑 数据长度发生变化 但是我下面依然是 noMore状态而且不在进入 onRefresh 的刷新状态

从当前页面跳出,再跳回,调用页面自动下拉刷新,有bug

从当前页面A Push出去到页面B,再从页面B Pop回到页面A,同时调用页面A的下拉刷新,_refreshController.requestRefresh(true),这时会有下拉刷新的动作,但是看不到headerIndicator,而且刷新完毕,ListView位置会往上串,代码的example也能够付现,请作者详查。同时对你的库表达谢意。

下滑刷新 Bug

下滑刷新 使用 RefreshStatus.completed 后不在进入 onRefresh 状态

使用 RefreshStatus.idle 会多次进入 onRefresh 状态

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.