#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. Я пробовал, но это не сработало, можете добавить это в мой код?