티스토리 뷰
자식 위젯이 버튼인데 버튼에서 실행하는 메서드도 자식 위젯에 정의가 되어있었다.
이것을 부모 위젯의 어느 버튼을 눌렀을 때도 호출이 될 수 있도록 연결 해야 한다.
글로벌키를 이용하는 방법이 가장 간단하겠지만, 왠지 직접 전역 변수를 선언하고 싶지는 않다...
좀더 세련된 방법이 없을까? 바로 떠오르지 않아 구글링을 해보니 쉽게 찾을 수 있었다.
typedef 을 사용하는 방법
Parent 쪽에 함수를 연결 할 수 있는 변수 y를 정의 해주고 parent의 버튼에서 이 함수 변수를 호출 (y.call) 하도록 만들어 둔다.
그리고 parent 에서 child를 생성할때 함수를 파라미터로 받아 parent의 함수 변수 y 에 연결하는 익명함수를 전달한다.
이 익명 함수를 전달 받은 child 에서는 위젯을 build 할 때 이것을 실행하여 child에서 정의한 함수 x를 이것의 파라미터로 전달한다. 그러면 익명함수에서는 x를 인자로 받은뒤 y에 연결하는 구문을 실행하게 되고, parent의 y는 x와 연결된다.
적용 후기: 동작은 하는데...문제가 있다.
" typedef MyBuilder = void Function(BuildContext context, void Function() methodA); "
를 선언한 파일의 경우, (안드로이드 스튜디오에서) 저 구문 아래의 code에 대해서 Analizer가 분석을 못하는 것같다. 이하의 코드에 대해서 변수나 클래스 정의 바로가기 단축키(ctrl + 우클릭) 같은 것들이 먹히지 않는다.
import 'package:flutter/material.dart';
typedef MyBuilder = void Function(BuildContext context, void Function() methodA);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
late void Function() myMethod;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.help),
onPressed: () {
// how can I call methodA from here?
myMethod.call();
},
),
),
body: HomePage(builder: (BuildContext context, void Function() methodA) {
myMethod = methodA;
},),
),
);
}
}
class HomePage extends StatefulWidget {
final MyBuilder builder;
const HomePage({Key? key, required this.builder}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
widget.builder.call(context, methodA);
return Text('HomePage');
}
void methodA() {
print('test');
}
}
참고자료: https://stackoverflow.com/questions/53692798/flutter-calling-child-class-function-from-parent-class
Flutter calling child class function from parent class
Code: class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( leading: IconButton( ...
stackoverflow.com
changeNotifier class를 사용하는 방법
아래는 자료는 typedef 대신 class 를 사용하는 방법이다. 큰틀에서 보면 비슷하다.
그리고 답변중에 GlobalKey를 사용 하는 바법도 나와있다.
https://stackoverflow.com/questions/72969209/how-to-call-a-method-of-a-child-stateful-widget-flutter
How to call a method of a child stateful widget? FLUTTER
How do I call method of child widget? class Parent extends StatefulWidget { const Parent({Key? key}) : super(key: key); @override State<Parent> createState() => _ParentState(); } c...
stackoverflow.com
'Dart & Flutter > 궁금했던 것, 몰랐던 것' 카테고리의 다른 글
Flutter에서 didUpdateWidget 메서드가 호출될 때 oldWidget.a와 widget.a 값이 둘 다 변경 후의 값을 가지는 이유 (0) | 2025.03.18 |
---|---|
Riverpod 을 자동생성기로 생성할 때 State Provider 는 지원하지 않음 (0) | 2024.07.26 |
TextField 영역 바깥을 터치시 keyboard 숨기기 (0) | 2024.01.17 |
system UI (status bar/navigation bar) 안 보이게 만들기 (0) | 2023.10.25 |
팝업창 위치 조정 (0) | 2023.10.16 |
- Total
- Today
- Yesterday
- IOS
- 다트
- DART
- hide
- UX
- 이미지
- Bluetooth
- TextFormField
- Flutter
- error
- 인사이트
- addPostFrameCallback
- 문제 해결
- BLE
- firebase
- 크롬
- SizedBox
- TextField
- Syncfusion
- 앱
- position
- 한빛미디어
- 디자인
- 에러
- 앱개발
- UI
- plugin
- 플러터
- Chrome
- 앱 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |