이번 포스트에서는 플러터의 상태 관리 라이브러리인 Riverpod을 사용하여 페이징 처리하는 방법을 알아보겠습니다. 페이징 처리는 대량의 데이터를 작은 단위로 나누어 불러오는 기술로, 효율적인 메모리 사용과 부드러운 스크롤을 제공하는 데 도움이 됩니다.
1. Riverpod 설치 및 설정
먼저, Riverpod을 프로젝트에 추가해야 합니다. pubspec.yaml
파일에 다음 의존성을 추가해주세요:
dependencies:
riverpod: ^1.0.0
의존성을 추가한 후, 패키지를 가져올 수 있도록 pub get
명령을 실행하세요.
2. Provider 정의
다음으로, 페이징 처리를 위한 Provider를 정의해야 합니다. riverpod.dart
파일을 만들고 다음 내용을 추가하세요:
import 'package:flutter_riverpod/flutter_riverpod.dart';
final pageProvider = StateProvider<int>((ref) => 0);
final itemsProvider = Provider<List<String>>((ref) {
final page = ref.watch(pageProvider).state;
final items = fetchItems(page);
return items;
});
List<String> fetchItems(int page) {
// 실제 데이터를 가져오는 로직을 구현하세요
// 예시: 네트워크 요청 등
return ["item 1", "item 2", "item 3"];
}
위 코드에서 pageProvider
는 현재 페이지를 저장하는 상태 프로바이더이고, itemsProvider
는 현재 페이지에 해당하는 데이터를 가져오는 프로바이더입니다. fetchItems
메서드는 실제 데이터를 가져오는 로직을 구현해야 합니다.
3. 위젯에서 Provider 사용
이제 위젯에서 정의한 Provider를 사용하여 데이터를 불러와 화면에 표시할 수 있습니다. 예를 들어, ListView 위젯을 사용하여 아이템을 표시하는 코드를 작성해보겠습니다:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class MyPage extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
final items = watch(itemsProvider);
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);
},
);
}
}
위 코드에서 watch(itemsProvider)
를 호출하여 itemsProvider
에 해당하는 데이터를 가져옵니다. 그 다음, ListView.builder를 사용하여 데이터를 리스트로 표시합니다.
4. 페이징 처리 코드 추가
마지막으로, 페이징 처리를 위한 코드를 추가해보겠습니다. ListView 위젯에 스크롤 리스너를 등록하여 스크롤이 끝에 도달했을 때 다음 페이지의 데이터를 불러오도록 합니다. 이를 위해 scroll_notification_listener
라이브러리를 설치해야 합니다.
dependencies:
scroll_notification_listener: ^1.0.0
다음은 코드의 일부분입니다:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:scroll_notification_listener/scroll_notification_listener.dart';
class MyPage extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
final items = watch(itemsProvider);
final page = watch(pageProvider);
final controller = ScrollController();
controller.addListener(() {
if (controller.position.atEdge && controller.position.pixels != 0) {
context.read(pageProvider).state = page.state + 1;
}
});
return ScrollNotificationListener(
onNotification: (_) {},
child: ListView.builder(
controller: controller,
itemCount: items.length,
...
),
);
}
}
위 코드에서 controller
를 생성하고 스크롤 리스너를 등록합니다. 스크롤이 끝에 도달하면 pageProvider
의 상태를 업데이트하여 다음 페이지의 데이터를 불러오도록 합니다.
이제 Riverpod을 사용하여 페이징 처리를 구현하는 방법에 대해 알아보았습니다. 이를 기반으로 실제 데이터를 불러오는 로직을 구현하여 원하는 페이징 기능을 구현해보세요.