플러터에서 리스트뷰를 스크롤 맨 밑으로 고정하여 렌더링하고 싶어서
아래 코드와 같은 흐름으로 작성했더니 오류가 발생했다.
void initState() {
super.initState();
// initState에서 스크롤 맨 밑으로 이동
_scrollController
.jumpTo(_scrollController.position.maxScrollExtent);
}
Widget build(BuildContext context) {
return ListView.builder(
controller: _scrollController, // 스크롤 컨트롤러
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text('Item $index'),
);
},
);
}
_AssertionError ('package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 107 pos 12: '_positions.isNotEmpty': ScrollController not attached to any scroll views.)
스크롤컨트롤러가 리스트뷰를 못 찾았다는 뜻인거 같다.
...
Widget build(BuildContext context) {
// 렌더링 된 후 즉시, 해당 함수 실행하여 스크롤 맨 밑으로 이동
SchedulerBinding.instance!.addPostFrameCallback((_) {
_scrollController
.jumpTo(_scrollController.position.maxScrollExtent);
});
return ListView.builder(
controller: _scrollController, // 스크롤 컨트롤러
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text('Item $index'),
);
},
);
}
addPostFrameCallback 메소드는 리스트뷰(위젯)가 렌더링 된 후 즉시 실행하는 메소드이다.
따라서 initState
로 스크롤컨트롤러를 초기화 하고,
리스트뷰
가 렌더링 된 후에, 스크롤 맨 밑으로 이동
이 되었다!