Untitled
unknown
plain_text
a month ago
2.1 kB
7
Indexable
import 'dart:async';
import 'package:flutter/material.dart';
mixin PaginationViewModel {
ScrollController scrollController = ScrollController();
final _paginationLoadingStreamController = StreamController<bool>.broadcast();
Stream<bool> get paginationLoadingStream$ => _paginationLoadingStreamController.stream;
bool _loadingCompleted = true;
void notifyListViewController({ScrollController? attachedScrollController}) {
// ignore: invalid_use_of_protected_member
if (scrollController.hasListeners) {
return;
}
scrollController.addListener(() {
if (scrollController.position.pixels > 0.8 * scrollController.position.maxScrollExtent) {
_loadMore();
}
if (attachedScrollController != null && !attachedScrollController.positions.contains(scrollController.position)) {
attachedScrollController.attach(scrollController.position);
}
});
}
int page = 1;
void initPagination() {}
Future<void> loadMore();
Future<void> _loadMore() async {
if (_loadingCompleted) {
_paginationLoadingStreamController.add(true);
_loadingCompleted = false;
page++;
await loadMore();
_loadingCompleted = true;
_paginationLoadingStreamController.add(false);
}
}
Future<void> paginationLoadMore() async {
await _loadMore();
}
void resetPagination() {
page = 1;
}
void paginationDispose() {
_paginationLoadingStreamController.close();
}
//NestedScrollView kullanıldığında, inner ListView'e scrollController verilirse NestedScrollView'in scroll'u çalışmıyor
// Bu sebeple sayfalamayı tetiklemek için ListView'i NotificationListener ile sarmalayıp bu methodu çağırmak gerekiyor
bool onNotificationChanged(Notification notification) {
if (notification is ScrollUpdateNotification || notification is ScrollEndNotification) {
final metrics = (notification as ScrollNotification).metrics;
if (metrics.maxScrollExtent > 0 && metrics.pixels > 0.8 * metrics.maxScrollExtent) {
_loadMore();
}
}
return true;
}
}
Editor is loading...
Leave a Comment