【问题标题】:Flutter getx infinite scroll refreshing listview every end scrollFlutter getx无限滚动刷新listview每次结束滚动
【发布时间】:2021-06-26 22:45:12
【问题描述】:

我正在尝试在列表视图中进行无限滚动。我正在从 API 获取数据。我正在使用getx。我的列表视图总是在滚动结束时重建。我找不到我做错的地方。

This is what i try to make

我的模型课;

List<ExploreModel> exploreModelFromJson(String str) => List<ExploreModel>.from(
    json.decode(str).map((x) => ExploreModel.fromJson(x)).toList());

String exploreModelToJson(List<ExploreModel> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

我的控制器;

class ExploreController extends GetxController {
  var isLoading = true.obs;
  var articleList = <ExploreModel>[].obs;
  var offsetCount = 0;

  @override
  void onInit() {
    fetchArticles();
    super.onInit();
  }

  void fetchArticles({int offsetCount = 0}) async {
    try {
      isLoading(true);
      var articles = await ApiService.fetchArticleList(offsetCount);

      if (articles != null) {
        articleList.addAll(articles);
      }
    } finally {
      isLoading(false);
    }
  }
}

我的 api 调用;

static Future<List<ExploreModel>> fetchArticleList(int offsetCount) async {
    var url = Uri.http(Config().baseUrl, Config().baseUrlPathGetArticles,
        {'offsetCount': '$offsetCount'});
    var response = await http.get(url);
    if (response.statusCode == 200) {
      return exploreModelFromJson(utf8.decode(response.bodyBytes));
    } else {
      return null;
    }

我的观点(StatefulWidget);

final ScrollController scrollController = new ScrollController(); int offsetCount = 0;

  @override
  void initState() {
    super.initState();
    scrollController.addListener(() {
      if (scrollController.position.pixels ==
          scrollController.position.maxScrollExtent) {
        offsetCount= offsetCount + 5;
        exploreController.fetchArticles(offsetCount: offsetCount);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        child: RefreshIndicator(
          key: _refreshIndicatorKey,
          onRefresh: () async {
            exploreController.fetchArticles();
          },
          child: Column(
            children: <Widget>[
              Expanded(
                child: Obx(() {
                  if (exploreController.isLoading.value) {
                    return CupertinoActivityIndicator();
                  }
                  return ListView.separated(
                    controller: scrollController,
                    itemCount: exploreController.articleList.length,
      }
...

【问题讨论】:

  • 我认为您应该将监听器条件更改为 scrollController.position.offset >= scrollController.position.maxScrollExtent
  • 您今天早些时候提出了一个问题,并在此处得到了答案stackoverflow.com/a/66865671/13558035,但您没有在此处将其标记为已回答或提供任何更新,但您正在使用该答案中的代码,并添加了 @ 987654327@ 到您的代码,显然它正在工作。
  • @HuthaifaMuayyad 感谢您的回复,但这段代码运行良好,但是当我到达滚动结束时,listview refrefshing ..我不想要这个。我希望继续使用新数据。

标签: flutter infinite-scroll flutter-getx


【解决方案1】:

我认为这应该可以解决您的问题。

itemCount: exploreController.articleList.length + 1 并在 itemBuilder 中添加条件 if (index == exploreController.articleList.length) //show progress indicator or somthing else 要么 你可以这样做 将您的列更改为列表视图并这样做

ListView(
        children: <Widget>[
            Obx(() {
              return ListView.separated(
                physics:NeverScrollableScrollPhysics(),
                controller: scrollController,
                itemCount: exploreController.articleList.length,
                itemBuilder(context,index){
                //show your widget
               }
  })
  Obx(()=>exploreController.isLoading.value? 
  Container(height: 100, child: CupertinoActivityIndicator())
  : Container() )

]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2016-01-26
    相关资源
    最近更新 更多