GlobalKey
... 이 녀석 어디다 쓰는지 명쾌하지 않았는데, 그중 한 예제가 될 수 있을 듯하다.
우선 키를 생성한다.
GlobalKey sizekey = GlobalKey();
사이즈 확인을 원하는 위젯에서, 키를 받아온다.
Positioned(
child: SizedBox(
key: sizekey, // apply Global key for check size...
width: 200,
height: 250,
),
),
onPressed
이하 코드를 보게 되면, GlobalKey
에서 Size
를 가져오게 된다. 솔직히 말하면, 정확하게 무슨 과정인지 잘 모르겠다.
Positioned(
top: 180,
left: 20,
child: TextButton(
style: ButtonStyle(
// foregroundColor: MaterialStateProperty.all(Colors.red),
foregroundColor:
MaterialStateProperty.resolveWith((states) {
if (states.contains(MaterialState.pressed)) {
return Colors.red;
} else {
return Colors.black;
}
}),
),
onPressed: () {
RenderBox renderBox =
sizekey.currentContext!.findRenderObject() as RenderBox;
Size sizeText = renderBox.size;
showToast(
'width : ${sizeText.width.toStringAsFixed(1)}' +
' / ' +
'height : ${sizeText.height.toStringAsFixed(1)}',
position: ToastPosition.bottom);
},
child: const Text(
'Widget Size Detecting',
),
),
),
그래도 원하는데로 되었긴 한데, 한가지 문제는 layout이 완료되기 전에는 그 사이즈를 알 수는 없다. 고로, 처음 렌더링을 할때 그 사이즈를 사용할 수는 없다는 것이다. 그래서, 최초 렌더링이 된 이후, 사이즈를 체크해서 적용하는 방법은 아래와 같다.
세 가지가 있는데, 뭔 차이가 있긴 하겠지만, 잘 모르겠다.
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
print("WidgetsBinding");
});
SchedulerBinding.instance.addPostFrameCallback((_) {
print("SchedulerBinding");
});
WidgetsBinding.instance.endOfFrame.then(
(_) {
if (mounted) {
print('it works too');
}
},
);
}
끝.
'Dead Code > Flutter_Dart' 카테고리의 다른 글
[플러터] 자질구래한 methods (0) | 2023.04.20 |
---|---|
[플러터] Rive 오랜만에 사용 (0) | 2023.03.26 |
[플러터] web 빌드 그리고 row/column 리스트 개별 관리 (0) | 2023.03.16 |
[플러터] Rive animation 실행은 해보자 #1 (0) | 2022.09.16 |
[플러터] reorderableList - 리스트 순서 바꾸기 (0) | 2022.09.14 |
[플러터] 탭한 위치의 위치값 찾기 (0) | 2022.09.13 |
[플러터] web - NetworkImage, 이미지 안뜰 때 (0) | 2022.09.01 |
[플러터] 엑셀 날짜를 DATETIME으로 변경 (0) | 2022.08.30 |
[플러터] 플러터로 만든 웹페이지 github 호스팅 시 안뜰 때. (0) | 2022.08.26 |
[다트] MAP : Map<int, List> (0) | 2022.08.05 |