motivation
주간 달력을 보여주기 위해 화면을 옆으로 밀면 페이지가 넘어가면서 새로운 데이터를 요청함
필요한 기능
페이지를 넘겨주기(무한 페이지)
넘겼을때 어느 방향으로 이동했는지 체크
1. 옆으로 밀어서 페이지 넘기기 : PageView
https://api.flutter.dev/flutter/widgets/PageView-class.html
PageView class - widgets library - Dart API
A scrollable list that works page by page. Each child of a page view is forced to be the same size as the viewport. You can use a PageController to control which page is visible in the view. In addition to being able to control the pixel offset of the cont
api.flutter.dev
PageView.builder를 사용하되 itemCount 없이 PageController에 inittialPage를 999와 같이 큰 수로 설정해두면 -999 ~ infinite 로 페이지를 이동할 수 있다.
final controller = new PageController(initialPage: 999);
...
new PageView.builder(
controller: controller,
itemBuilder: (context, index) {
return new Center(
child: new Text('${index % 5}'),
);
},
)
Is there a way to have an infinite loop using PageView in Flutter?
Is there a way to have an infinite loop using PageView in Flutter? For example if my PageView has 5 pages, after swiping to page 5, I would be able to swipe again in the same direction to get to Pa...
stackoverflow.com
2. 넘겼을때 어느 방향으로 이동했는지 체크
왼쪽으로 이동하면 이전 주의 데이터를 요청해야할 것이고 오른쪽으로 이동하면 다음주 데이터를 요청할 것인데 이것은 어떻게 알 수 있을까?
onPageChanged 는 페이지가 이동했을때 하고 싶은 동작을 구현할 수 있고 initialPage로 설정된 값으로부터 이동한 만큼 +-1 값을 뱉어준다. 어느 방향으로 이동했는지 모니터링하기 위해서 currentWeekPage를 선언해주었다.
PageController? pageViewController;
int? currentWeekPage;
@override
void initState() {
pageViewController = PageController(initialPage: 999);
currentWeekPage = 999;
super.initState();
}
페이지가 이동함에 따라 원하는 동작을 수행하고 현재의 페이지 값을 변경해주었다.
PageView.builder(
onPageChanged: (index) {
// print('index before change page: $index');
// print('currentWeekPage before change page: $currentWeekPage');
if (index < currentWeekPage!) {
// print('지난주를 요청');
setState(() {
initDate = initDate.subtract(Duration(days: 7));
deliveryWeekEvent(initDate);
_weekOfMonth = weekCalendarHelper.weekOfMonthForSimple(initDate);
currentWeekPage = index;
});
// print(initDate);
// print("after currentWeekPage : $currentWeekPage");
} else if (index > currentWeekPage!) {
// print('다음주를 요청');
setState(() {
initDate = initDate.add(Duration(days: 7));
deliveryWeekEvent(initDate);
_weekOfMonth = weekCalendarHelper.weekOfMonthForSimple(initDate);
currentWeekPage = index;
});
// print(initDate);
// print("after currentWeekPage : $currentWeekPage");
}
},
controller: pageViewController,
itemBuilder: (context, index) {
return _buildWeekCalendar();
})
주차 구하는 방법은 cyb9701님 블로그 참조
Flutter | N월 N주차(몇주차) 구하기
n월 n주차 프로젝트 진행 중 월 주차를 구해야되는 기능이 있어서 시작했습니다. 보통 매월 1일이 있는 주를 1주로 계산하고 있었는데 월별 주차를 구하는 방법에도 국제 기준이 있다고 합니다. >
velog.io
'Flutter' 카테고리의 다른 글
| [Flutter] table 셀 너비 자동 맞춤 (0) | 2022.04.23 |
|---|---|
| [Flutter] move scrollController to top or bottom; scroll 위치 이동하기 (0) | 2022.04.23 |
| [Flutter] api event 수신하여 table_calendar 달력 그리기 (0) | 2022.04.22 |
| [Flutter] for loop in row; Row에서 반복하여 위젯을 그리기 (0) | 2022.04.21 |
| [Flutter] "A RenderFlex overflowed by 143 pixels on the right." (0) | 2022.04.21 |