Как я могу обновить listview.builder в flutter?

#flutter #pull-to-refresh #flutter-listview

Вопрос:

как я могу добавить обновление в listview.builder в flutter? Это мой экран «весь код с сообщений», когда я удаляю сообщение или добавляю новое сообщение не в реальном времени сразу после горячего перезапуска он работал Я хочу добавить обновление в listview Я вызвал метод getPosts в refreshIndecator, но не работал пожалуйста, кто-нибудь может мне помочь? Спасибо.

Код :

 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)));
  }
}
 

Ответ №1:

Почему бы вам не попробовать использовать для этой цели виджет индикатора обновления? Проверьте пример использования в официальной документации Flutter

Комментарии:

1. Я пробовал, но это не сработало, можете добавить это в мой код?