Flutter
[Flutter] Dio 패키지 사용해 보기
ekkkang
2025. 1. 14. 12:22
https://pub.dev/packages/dio/install
dio install | Dart package
A powerful HTTP networking package, supports Interceptors, Aborting and canceling a request, Custom adapters, Transformers, etc.
pub.dev
pubspec.yaml
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
dio: ^5.7.0
import 'package:dio/dio.dart';
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: SafeArea(
child: Scaffold(
body: HomePage(),
),
),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
// 통신을 담당하는 클라언트 측 객체를 가져오자
Dio _dio = Dio();
@override
void initState() {
super.initState();
// 객체 실행시 한번 호출 메서드
_fetchTodos();
}
@override
Widget build(BuildContext context) {
return const Placeholder();
}
// 통신을 담당하는 메서드를 만들어 보자.
_fetchTodos() async {
// https://jsonplaceholder.typicode.com/todos/1
// 통신을 담당하는 코드를 기본적으로 예외처리을 꼭 넣자
try {
Response response =
await _dio.get('https://jsonplaceholder.typicode.com/todos/1');
print('HTTP status code : ${response.statusCode}');
print('서버측 전달한 데이터 : ${response.data}');
print(
'json 통신 후 dart 에서는 어떤 타입으로 변경 되었을까? : ${response.data.runtimeType}');
// Map 타입에 값을 출력하는 방법
print('-----------------------------------------------');
print('data-> title 값 확인 : ${response.data['title']}');
} catch (e) {
print('실행 시점 예외가 발생 했어요');
print(e.toString());
}
}
}
import 'package:dio/dio.dart';
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: SafeArea(
child: Scaffold(
body: HomePage(),
),
),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
// 통신을 담당하는 클라언트 측 객체를 가져오자
Dio _dio = Dio();
@override
void initState() {
super.initState();
// 객체 실행시 한번 호출 메서드
_fetchTodos();
}
@override
Widget build(BuildContext context) {
return const Placeholder();
}
// 통신을 담당하는 메서드를 만들어 보자.
_fetchTodos() async {
// https://jsonplaceholder.typicode.com/todos/1
// 통신을 담당하는 코드를 기본적으로 예외처리을 꼭 넣자
try {
Response response =
await _dio.get('https://jsonplaceholder.typicode.com/todos/1');
print('HTTP status code : ${response.statusCode}');
print('서버측 전달한 데이터 : ${response.data}');
print(
'json 통신 후 dart 에서는 어떤 타입으로 변경 되었을까? : ${response.data.runtimeType}');
// Map 타입에 값을 출력하는 방법
print('-----------------------------------------------');
Todo todo1 = Todo.fromJson(response.data);
print("todo1 : ${todo1}");
print('-----------------------------------------------');
// Map 으로 들어온 데이터를 Todo 객체를 생성해서 상태 값을 담아 보시오
} catch (e) {
print('실행 시점 예외가 발생 했어요');
print(e.toString());
}
}
}
// dart
class Todo {
int? userId;
int? id;
String? title;
bool? completed;
Todo(
{required this.userId,
required this.id,
required this.title,
required this.completed});
// dart 생성자 -> 명명된 생성자
Todo.fromJson(Map<String, dynamic> json)
: userId = json['userId'],
id = json['id'],
title = json['title'],
completed = json['completed'];
@override
String toString() {
return 'Todo{userId: $userId, id: $id, title: $title, completed: $completed}';
}
}
import 'package:dio/dio.dart';
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: SafeArea(
child: Scaffold(
body: HomePage(),
),
),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Dio _dio = Dio();
// 모델링한 타입 추가
Todo? _todo;
@override
void initState() {
super.initState();
// 객체 실행시 한번 호출 메서드
_fetchTodos();
}
@override
Widget build(BuildContext context) {
return Center(
child: _todo == null
? CircularProgressIndicator()
: Column(
children: [
Text('ID : ${_todo!.id}'),
Text('userId : ${_todo!.userId}'),
Text('title : ${_todo!.title}'),
Text('completed : ${_todo!.completed}'),
],
),
);
}
// 통신을 담당하는 메서드를 만들어 보자.
_fetchTodos() async {
try {
Response response =
await _dio.get('https://jsonplaceholder.typicode.com/todos/1');
// 멤버 변수 값을 담는다.
_todo = Todo.fromJson(response.data);
setState(() {});
} catch (e) {
print('실행 시점 예외가 발생 했어요');
print(e.toString());
}
}
}
// dart
class Todo {
int? userId;
int? id;
String? title;
bool? completed;
Todo(
{required this.userId,
required this.id,
required this.title,
required this.completed});
// dart 생성자 -> 명명된 생성자
Todo.fromJson(Map<String, dynamic> json)
: userId = json['userId'],
id = json['id'],
title = json['title'],
completed = json['completed'];
@override
String toString() {
return 'Todo{userId: $userId, id: $id, title: $title, completed: $completed}';
}
}