목차
- 사용된 기능 설명
- 사용 예시
✅ 사용된 기능 설명
- Rx : ReactiveX 의 줄임말
- 변수 [index].update((val){...}
- 변수 리스트에서 특정 Rx 객체를 ( [index] )
- 내부 값을 val로 받아서 수정 ( update((val){...}) )
- 수정 후 GetX가 UI 갱신을 자동으로 수행
- val?.변수1 = 변수2; : val이 null이 아닐 때만 변수1을 변수2 으로 변경
- Get.put() : GetX에서 의존성 주입을 할 때 쓰는 메소드
- .obs : 반응형 변수를 만드는 GetX의 문법으로, 변수에 .obs를 붙이면 그 변수를 감시하는 역할
- 예시
var count = 0.obs; // count는 그냥 int가 아니고, RxInt 타입이 되어 값이 바뀌면 UI에 자동으로 반영
print(count.value); // 0
count.value++; // Rx타입은 .value로 접근/수정
print(count.value); // 1
- 예시
- GetMaterialApp : MaterialApp을 확장(상속)한 위젯으로, GetX의 기능을 앱 전체에서 사용할 수 있도록 지원
** GetX를 사용하기 위해선 GetMaterialApp를 반드시 사용
- GetX 기능
- 라우팅 (페이지 이동)
Get.to(SecondPage()); // push
Get.off(SecondPage()); // 현재 페이지 닫고 새 페이지
Get.offAll(SecondPage()); // 모든 스택 날리고 새 페이지 - 스낵바 / 다이얼로그
Get.snackbar("제목", "내용"); // 스낵바
Get.defaultDialog(title: "알림", middleText: "진짜 삭제한다?"); // 다이얼로그 - 의존성 주입 & 상태관리
Get.put(), Get.find() 같은 GetX DI 기능을 앱 전체에서 쓸 수 있음.
GetMaterialApp 없이는 Get.snackbar, Get.to 같은 기능이 정상적으로 동작하지 않음. - 네비게이션 관리 (라우트 테이블)
- 라우팅 (페이지 이동)
- GetX 기능
✅ 사용 예시
1️⃣ pubspec.yaml 설정

2️⃣ Model 작성

3️⃣ Controller 작성

4️⃣ Main.dart 작성
- Widget builder() 의 리턴값으로 GetMaterialApp()을 주기 때문에 runApp( const MyApp() ); 에서 const 삭제
- Widget builder() 의 리턴값으로 GetMaterialApp()을 주기 때문에 const MyApp({super.key}); 에서 const 삭제


5️⃣ 테스트
✔️ 사용된 코드
1️⃣ Model
class Student{
int studentId;
String studentName;
String studentGrade;
// named parameter(이름 있는 매개변수) 와 기본값(default value) 를 사용
// this.studentId = 0 은 해당 생성자 호출 시 값을 안 줘도 기본값 0으로 초기화
Student({this.studentId = 0, this.studentName = "", this.studentGrade = ""});
}
2️⃣ Controller
import 'package:get/get.dart';
import 'package:프로젝트명/studentModel.dart';
class StudentController extends GetxController{
// Rx : ReactiveX 의 줄임말
RxList<Rx<Student>> studentList = [
Student(studentId: 1, studentName: "르브론", studentGrade: "A").obs,
Student(studentId: 2, studentName: "돈치치", studentGrade: "B").obs,
Student(studentId: 3, studentName: "리브스", studentGrade: "C").obs,
].obs;
List<String> newStudentName = ["하치무라", "라라비아", "에이튼"];
List<String> newStudentGrade = ["B+", "A+", "C+"];
void updateStudentName(String name, int index){
studentList[index].update((val){ // studentList에서 특정 학생(Rx<Student>)을 꺼내서, 내부 Student 객체를 val이라는 이름으로 가져온 뒤, val을 수정할 수 있도록 준비
val?.studentName = name; // val이 null이 아닐 때만 studentName 속성을 name 으로 변경
});
}
void updateStudentGrade(String grade, int index){
studentList[index].update((val){
val?.studentGrade = grade;
});
}
}
3️⃣ main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:프로젝트명/studentController.dart';
void main() {
// 컴파일러의 시작 지점 (void main())
runApp(MyApp());
}
// void main() => runApp(const MyApp()); // 위에 void main() 코드랑 동일
class MyApp extends StatelessWidget {
// main() 에서 반환되는 위젯
MyApp({super.key});
final StudentController _con = Get.put(StudentController()); // Get.put() : GetX에서 의존성 주입을 할 때 쓰는 메소드
@override
Widget build(BuildContext context) {
return GetMaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: Scaffold(
appBar: AppBar(title: const Text("GetX 테스트")),
body: ListView.builder(
itemCount: _con.studentList.length,
itemBuilder: (BuildContext context, int index) {
return Container(
margin: const EdgeInsets.all(15),
padding: const EdgeInsets.all(15),
child: Column(
children: [
GetX<StudentController>(
builder: (_) => Text(
"ID : ${_con.studentList[index]().studentId} / NAME : ${_con.studentList[index]().studentName} / GRADE : ${_con.studentList[index]().studentGrade}",
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () => _con.updateStudentName(_con.newStudentName[index], index),
child: Text("이름 변경"),
),
TextButton(
onPressed: () =>
_con.updateStudentGrade(_con.newStudentGrade[index], index),
child: Text("성적 변경"),
),
],
),
],
),
);
},
),
),
);
}
}
'IT 언어 > Flutter' 카테고리의 다른 글
| [Flutter] 웹뷰 (webview_flutter) [맥북💻] (0) | 2025.09.28 |
|---|---|
| [Flutter] 푸시 알림 보내기 (Local Notifications) [맥북💻] (0) | 2025.09.28 |
| [Flutter] GetX (Simple State, GetBuilder, Get.find, update()) [맥북💻] (0) | 2025.09.27 |
| [Flutter] BLoC 패턴 (factory, dynamic, required, rxdart, http) [맥북💻] (0) | 2025.09.25 |
| [Flutter] 아래로 스와이프하여 새로고침 (RefreshIndicator) [맥북💻] (0) | 2025.09.23 |