1단계 - 기본 코드 작성
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: ParentsView(),
);
}
}
// 부모 클래스
class ParentsView extends StatefulWidget {
const ParentsView({super.key});
@override
State<ParentsView> createState() => _ParentsViewState();
}
class _ParentsViewState extends State<ParentsView> {
String displayText = '여기는 부모 위젯 변수야';
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: [
Expanded(flex: 1, child: Center(child: Text(displayText))),
Expanded(flex: 1, child: ChildA()),
Expanded(flex: 1, child: ChildB()),
],
),
),
);
}
}
// 자식 a
class ChildA extends StatelessWidget {
const ChildA({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child a 에 이벤트 발생 ');
},
child: Container(
width: double.infinity,
color: Colors.orange,
child: Center(child: Text('CHILD A')),
),
),
);
}
}
// 자식 b
class ChildB extends StatelessWidget {
const ChildB({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child b 에 이벤트 발생 ');
},
child: Container(
width: double.infinity,
color: Colors.red,
child: Center(child: Text('CHILD B')),
),
),
);
}
}
2단계 - 콜백 메서드 연결해보기
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: ParentsView(),
);
}
}
// 부모 클래스
class ParentsView extends StatefulWidget {
const ParentsView({super.key});
@override
State<ParentsView> createState() => _ParentsViewState();
}
class _ParentsViewState extends State<ParentsView> {
String displayText = '여기는 부모 위젯 변수야';
// 메서드를 선언해 보자
void handleChildEvent() {
// build() 메서드 호출
setState(() {
displayText = '야 어딘지는 모르겠지만 자식 위젯에서 이벤트 발생';
});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: [
Expanded(flex: 1, child: Center(child: Text(displayText))),
Expanded(
flex: 1, child: ChildA(onCallbackReceived: handleChildEvent)),
Expanded(
flex: 1, child: ChildB(onCallbackReceived: handleChildEvent)),
],
),
),
);
}
}
// 자식 a
class ChildA extends StatelessWidget {
const ChildA({required this.onCallbackReceived, super.key});
final Function onCallbackReceived;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child a 에 이벤트 발생 ');
// Fuction 데이터 타입
// onCallbackReceived() ---> 호출
onCallbackReceived();
},
child: Container(
width: double.infinity,
color: Colors.orange,
child: Center(child: Text('CHILD A')),
),
),
);
}
}
// 자식 b
class ChildB extends StatelessWidget {
const ChildB({required this.onCallbackReceived, super.key});
final Function onCallbackReceived;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child b 에 이벤트 발생 ');
onCallbackReceived();
},
child: Container(
width: double.infinity,
color: Colors.red,
child: Center(child: Text('CHILD B')),
),
),
);
}
}
3단계 - 자식에게 온 데이터를 전달 받아 화면에 그려 보기
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: ParentsView(),
);
}
}
// 부모 클래스
class ParentsView extends StatefulWidget {
const ParentsView({super.key});
@override
State<ParentsView> createState() => _ParentsViewState();
}
class _ParentsViewState extends State<ParentsView> {
String displayText = '여기는 부모 위젯 변수야';
// 메서드를 선언해 보자
void handleChildEvent(String message) {
// build() 메서드 호출
setState(() {
displayText = message;
});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Column(
children: [
Expanded(flex: 1, child: Center(child: Text(displayText))),
Expanded(
flex: 1, child: ChildA(onCallbackReceived: handleChildEvent)),
Expanded(
flex: 1, child: ChildB(onCallbackReceived: handleChildEvent)),
],
),
),
);
}
}
// 자식 a
class ChildA extends StatelessWidget {
const ChildA({required this.onCallbackReceived, super.key});
final Function(String message) onCallbackReceived;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child a 에 이벤트 발생 ');
// Fuction 데이터 타입
// onCallbackReceived() ---> 호출
onCallbackReceived('A가 연산한 데이터를 전달 했음');
},
child: Container(
width: double.infinity,
color: Colors.orange,
child: Center(child: Text('CHILD A')),
),
),
);
}
}
// 자식 b
class ChildB extends StatelessWidget {
const ChildB({required this.onCallbackReceived, super.key});
final Function(String message) onCallbackReceived;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(30.0),
child: InkWell(
onTap: () {
print('child b 에 이벤트 발생 ');
onCallbackReceived('자식 b가 연산한 데이터 전달');
},
child: Container(
width: double.infinity,
color: Colors.red,
child: Center(child: Text('CHILD B')),
),
),
);
}
}
'Flutter' 카테고리의 다른 글
[Flutter] Dio 패키지 사용해 보기 (0) | 2025.01.14 |
---|---|
[Flutter] Dart 비동기 프로그래밍 - 1 (1) | 2025.01.14 |
[Flutter] ListView_GridView_PageView (1) | 2025.01.13 |
[Flutter] login app 만들기 (0) | 2025.01.13 |
[Flutter] profile app 만들기 (0) | 2025.01.08 |