728x90

DIO 라이브러리 interceptors 사용 시 Null Safety 전후 변동사항

initializeInterceptors(){
  _dio.interceptors.add(InterceptorsWrapper(
    onError: (error){
      print(error.message);
    },
    onRequest: (request){
      print("${request.method} ${request.path}");
    },
    onResponse: (response){
      print(response.data);
    }
  ));
}
 
// ------ Null Safety 이후 -----------------------------
 
initializeInterceptors() {
  _dio.interceptors.add(InterceptorsWrapper(
    onRequest: (request, handler) async {
      print("${request.method} ${request.path}");
    },
    onResponse: (response, handler) async {
      print(response.data);
    },
    onError: (error, handler) async {
      print(error.message);
    },
  ));
}

 

pubspec.yaml 수정사항 : Null Safety 기준 : 2.12.0

- flutter pub add http 및 flutter pub add dio , flutter pub add json_serializable 을 각각 터미널 창에서 실행

- flutter pub get 를 하면 아래 dependencies 에 최신 버전이 추가된다.

environment:
  sdk: ">=2.17.5 <3.0.0"
 
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2
  http: ^0.13.4
  dio: ^4.0.6
  json_serializable: ^6.2.0
 
 
dev_dependencies:
  flutter_test:
    sdk: flutter
 
  flutter_lints: ^2.0.0
  build_runner: ^2.1.11
 
flutter:
 
  uses-material-design: true
  assets:
    - images/photo_base.png
 

 

User 클래스 생성하는 방법이 아래와 같은 방식으로 구글에서 많이 검색된다.

이전 게시글에서 직접 User Class 를 정의한 것과 동일하므로 비교해보는 것도 ....

user.dart 파일

import 'package:json_annotation/json_annotation.dart';
 
part 'user.g.dart';
// 아래와 같이 Class 를 정의하고 터미널 창에서
// flutter pub run build_runner build
// flutter pub get
 
@JsonSerializable()
class User {
  int idx;
  @JsonKey(name : "userNM")
  String userNM;
  @JsonKey(name : "mobileNO")
  String mobileNO;
  @JsonKey(name : "telNO")
  String telNO;
 
  String photo;
 
  User(
      {required this.idx,
        required this.userNM,
        required this.mobileNO,
        required this.telNO,
        required this.photo});
 
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
 
}

 

자동 생성된 user.g.dart 파일

// GENERATED CODE - DO NOT MODIFY BY HAND
 
part of 'user.dart';
 
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
 
User _$UserFromJson(Map<String, dynamic> json) => User(
      idx: json['idx'] as int,
      userNM: json['userNM'] as String,
      mobileNO: json['mobileNO'] as String,
      telNO: json['telNO'] as String,
      photo: json['photo'] as String,
    );
 
Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
      'idx': instance.idx,
      'userNM': instance.userNM,
      'mobileNO': instance.mobileNO,
      'telNO': instance.telNO,
      'photo': instance.photo,
    };
 

 

http_service.dart 파일

import 'package:dio/dio.dart';
 
class DioService {
  late final Dio _dio;
  final baseUrl = 'https://www.abc.com';
 
  DioService(){
    BaseOptions options = BaseOptions(
      baseUrl: baseUrl,
      connectTimeout: 3000,
      receiveTimeout: 3000,
    );
 
    _dio = Dio(options);
    initializeInterceptors();
  }
 
  Future<Response> getRequest(String endPoint) async {
    Response response;
 
    try {
      response = await _dio.get(endPoint);
    } on DioError catch (e) {
      print(e.message);
      throw Exception(e.message);
    }
 
    return response;
  }
 
  initializeInterceptors() {
    _dio.interceptors.add(InterceptorsWrapper(
      onRequest: (request, handler) async {
        print("${request.method} ${request.path}");
        return handler.next(request);
      },
      onResponse: (response, handler) async {
        print(response.headers);
        print(response.data);
        return handler.next(response);
      },
      onError: (error, handler) async {
        print(error.message);
        return handler.next(error);
      },
    ));
  }
}

 

main.dart 파일

import 'package:dio_sampe2/network/http_service.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'model/user.dart';
 
void main() {
  runApp(const MyApp());
}
 
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
 
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'JSON Data Parsing Demo'),
    );
  }
}
 
class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
 
  final String title;
 
  @override
  State<MyHomePage> createState() => _MyHomePageState();
}
 
class _MyHomePageState extends State<MyHomePage> {
  bool isLoading = false;
  late List<User> users;
  late DioService dio;
 
  Future getListUser() async {
    Response response;
    try {
      isLoading = true;
      response = await dio.getRequest("/androidSample/getData_Flutter2.php");
      isLoading = false;
 
      if (response.statusCode == 200) {
        setState(() {
          users = response.data.map<User>((json) {
            return User.fromJson(json);
          }).toList();
        });
      } else {
        print("There is some problem status code not 200");
      }
    } on Exception catch (e) {
      isLoading = false;
      print(e);
    }
  }
 
  @override
  void initState() {
    dio = DioService();
    getListUser();
    super.initState();
  }
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : users != null
              ? ListView.builder(
                  itemCount: users.length,
                  itemBuilder: (context, index) {
                    final user = users[index];
 
                    return ListTile(
                      title: Text(user.userNM),
                      leading: user.photo.length == 0
                          ? Image.asset('images/photo_base.png')
                          : Image.network(
                              'https://www.abc.com/androidSample/photos/${user.photo}'),
                      subtitle: Text(user.mobileNO),
                    );
                  },
                )
              : Center(
                  child: Text("No User Object"),
                ),
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            onPressed: () {
              setState(() {
                //getServerDataWithHttp();
              });
            },
            tooltip: 'Increment',
            child: const Icon(Icons.add),
          ),
          SizedBox(
            width: 10.0,
            height: 10.0,
          ),
          FloatingActionButton(
            onPressed: () {
              setState(() {
                dio = DioService();
                getListUser();
              });
            },
            tooltip: 'Increment',
            child: const Icon(Icons.remove),
          ),
        ],
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}
 
 

 

서버에 있는 List 자료를 가져와서 ListView 에 보여주는 코드 구현의 기본 샘플이 작성되었다.

 

https://github.com/themaaz32/dio_and_json 는 Null Safety 이전 코드인데, 참고하면 도움된다.

 

 

 

 

'Flutter 앱 > Network' 카테고리의 다른 글

ListView.separated 예제  (0) 2023.11.20
Flutter Login Example  (0) 2022.07.25
Session vs JWT  (0) 2022.07.22
Flutter Login 로직 구현 예제 (오류 포함)  (0) 2022.07.22
Flutter DIO 라이브러리 예제 1  (0) 2022.06.29
블로그 이미지

Link2Me

,