Untitled

 avatar
unknown
plain_text
a month ago
2.1 kB
6
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