저번에 freezed와 retrofit 기본 사용법에 대해서 알아보았다. 이번엔 두 라이브러리를 모두 이용해서 간단하게 로컬 서버와 연동해보았다. 서버와 통신해야 하는 데이터가 많다면 작성할 코드의 양이 상당히 많이 줄어들기 때문에 종종 자주 사용할 것 같기도 하다
pubspec.yaml
dependencies:
dio:
retrofit:
freezed_annotation:
dev_dependencies:
retrofit_generator:
build_runner:
json_serializable:
freezed:
rest_client.dart
import 'package:dio/dio.dart';
import 'package:flutter_study/pages/retrofit_with_freezed/student.dart';
import 'package:retrofit/retrofit.dart';
part 'rest_client.g.dart';
(baseUrl: 'http://localhost:8080')
abstract class RestClient {
factory RestClient(Dio dio, {String baseUrl}) = _RestClient;
('/student')
Future<List<Student>> getStudents();
('/student/{id}')
Future<Student> getStudentByID(() int id);
}
student.dart
import 'package:freezed_annotation/freezed_annotation.dart';
part 'student.g.dart';
part 'student.freezed.dart';
class Student with _$Student {
factory Student({
required int id,
required String name,
required String email,
(name: 'is_like_flutter') required bool isLikeFlutter,
}) = _Student;
factory Student.fromJson(Map<String, dynamic> json) =>
_$StudentFromJson(json);
}
위 두 파일을 작성해주고 flutter pub run build_runner build를 실행시켜준다. 파일에 생성될 코드 이외에 오류가 있으면 생성이 되지 않으므로 주의해야 한다. 이번에 작성하면서 여러번 실행시켰다
result_page.dart
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_study/pages/retrofit_with_freezed/rest_client.dart';
import 'package:flutter_study/pages/retrofit_with_freezed/student.dart';
class ResultPage extends StatefulWidget {
const ResultPage({Key? key}) : super(key: key);
_ResultPageState createState() => _ResultPageState();
}
class _ResultPageState extends State<ResultPage> {
late RestClient client;
Dio dio = Dio();
void initState() {
super.initState();
client = RestClient(dio);
}
studentColumn(Student student) {
return Column(
children: [
Text('${student.id}'),
Text('${student.name}'),
Text('${student.email}'),
Text('${student.isLikeFlutter}'),
],
);
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Retrofit with Freezed'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('getStudents'),
FutureBuilder(
future: client.getStudents(),
initialData: [],
builder: (_, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
List<Student> students = snapshot.data;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
studentColumn(students[0]),
studentColumn(students[1]),
studentColumn(students[2]),
],
);
},
),
SizedBox(
height: 50,
),
Text('getStudentByID'),
FutureBuilder(
future: client.getStudentByID(1),
builder: (_, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
final Student student = snapshot.data;
return studentColumn(student);
},
),
],
),
),
);
}
}
main.go
package main
'
'
'
type Student struct {
Id int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
IsLikeFlutter bool `json:"is_like_flutter"`
}
var students = []Student{
{
Id: 1,
Name: "Kim",
Email: "naver.com",
IsLikeFlutter: false,
},
{
Id: 2,
Name: "Lee",
Email: "google.com",
IsLikeFlutter: true,
},
{
Id: 3,
Name: "Jung",
Email: "kakao.com",
IsLikeFlutter: false,
},
}
func main() {
e := echo.New()
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.GET("/student", func(c echo.Context) error {
return c.JSON(http.StatusOK, students)
})
e.GET("/student/:id", func(c echo.Context) error {
id, _ := strconv.Atoi(c.Param("id"))
var s Student
for _, student := range students {
if student.Id == id {
s = student
}
}
return c.JSON(http.StatusOK, s)
})
e.Logger.Fatal(e.Start(":8080"))
}
간단하게 서버와 연동을 해봤다. 서버와 통신할 데이터가 많지 않다면 직접 작성을 해도 되겠지만 데이터의 양이 많고 변경할 상황이 많지 않다면 사용하면서 많은 이점을 얻을 수 있는 것 같다. 사실 작성할 코드가 줄어드는 것만 해도 신세계였다.
그건 그렇고 이미지 크기를 조절하는게 되지 않는다. 이번엔 한 장 뿐이라 첨부했다. 구글링을 해보니 마크업 문법이 적용된다고 하는데 크기는 왜 조절이 되지 않는지 잘 모르겠다.
소스코드 https://github.com/leeeeeoy/flutter_personal_study/tree/master/lib/pages/retrofit_with_freezed
참고자료