【问题标题】:How can I refresh listview.builder in flutter?如何在颤动中刷新 listview.builder?
【发布时间】:2021-10-19 17:18:36
【问题描述】:

如何在颤振中向 listview.builder 添加刷新? 这是我在帖子屏幕上的所有代码,当我在热重启后不实时删除帖子或添加新帖子时它工作了我想向列表视图添加刷新我在 refreshIndecator 中调用了 getPosts 方法但没有工作请有人可以帮助我吗?谢谢。

代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:data_connection_checker/data_connection_checker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:social_media_app/models/post.dart';
import 'package:social_media_app/posts/create_post.dart';
import 'package:social_media_app/utils/firebase.dart';
import 'package:social_media_app/widgets/indicators.dart';
import 'package:social_media_app/widgets/posts_view.dart';

class Timeline extends StatefulWidget {
  @override
  _TimelineState createState() => _TimelineState();
}

class _TimelineState extends State<Timeline> {
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();

  List<DocumentSnapshot> post = [];

  bool isLoading = false;

  DocumentSnapshot lastDocument;

  ScrollController _scrollController;

  getPosts() async {
    if (isLoading) {
      return CircularProgressIndicator();
    }
    if (mounted)
      setState(() {
        isLoading = true;
      });
    QuerySnapshot querySnapshot;
    if (lastDocument == null) {
      querySnapshot =
          await postRef.orderBy('timestamp', descending: true).get();
    } else {
      querySnapshot = await postRef
          .orderBy('timestamp', descending: true)
          .startAfterDocument(lastDocument)
          .get();
    }

    lastDocument = querySnapshot.docs[querySnapshot.docs.length - 1];
    post.addAll(querySnapshot.docs);
    if (mounted)
      setState(() {
        isLoading = false;
      });
  }

  @override
  void initState() {
    super.initState();
    getPosts();
    _scrollController?.addListener(() {
      double maxScroll = _scrollController.position.maxScrollExtent;
      double currentScroll = _scrollController.position.pixels;
      double delta = MediaQuery.of(context).size.height * 0.25;
      if (maxScroll - currentScroll <= delta) {
        getPosts();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: scaffoldKey,
      appBar: AppBar(
        automaticallyImplyLeading: false,
        title: Text(
          'Admin App',
          style: TextStyle(fontWeight: FontWeight.w900),
        ),
      
        leading: IconButton(
            onPressed: () => Navigator.push(
                context, MaterialPageRoute(builder: (_) => CreatePost())),
            icon: Icon(Feather.plus)),
        centerTitle: true,
      ),
      body: isLoading
          ? circularProgress(context)
          : ListView.builder(
            controller: _scrollController,
            itemCount: post.length,
            itemBuilder: (context, index) {
              internetChecker(context);
              PostModel posts = PostModel.fromJson(post[index].data());
              return Padding(
                padding: const EdgeInsets.all(10.0),
                child: Posts(post: posts),
              );
            },
          ),
    );
  }

  internetChecker(context) async {
    bool result = await DataConnectionChecker().hasConnection;
    if (result == false) {
      showInSnackBar('No Internet Connection', context);
    }
  }

  void showInSnackBar(String value, context) {
    ScaffoldMessenger.of(context).removeCurrentSnackBar();
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(value)));
  }
}

【问题讨论】:

    标签: flutter pull-to-refresh flutter-listview


    【解决方案1】:

    您为什么不尝试为此目的使用刷新指示器小部件。查看 Flutter 官方文档中的sample usage

    【讨论】:

    • 我试过了,但是没用,可以添加到我的代码中吗?
    猜你喜欢
    • 2020-05-12
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2021-01-02
    • 2020-10-24
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多