CodeingTestPrac

1월 31일-Flutter 4 /json 파싱

sung.hyun.1204 2022. 1. 31. 21:46

드디어,, json에 데이터를 받아왔다,.. ㅠㅠ

https://docs.flutter.dev/cookbook/networking/fetch-data

 

Fetch data from the internet

How to fetch data over the internet using the http package.

docs.flutter.dev

 

서버 json 포함

https://1e85ce8f-6ffc-402d-9365-0576000728de.mock.pstmn.io/api/members 

 

 

복잡한 json 을 파싱하는 작업이 이해 하기 힘들었지만 참고하고 만들었다.

https://oowgnoj.dev/post/flutter-json

 

[번역] 복잡한 JSON 파싱하기 in flutter

기억하기 위해 기록합니다.

oowgnoj.dev

 

 

 

 

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

Future<Album> fetchAlbum() async {
  final response = await http.get(Uri.parse(
      "https://1e85ce8f-6ffc-402d-9365-0576000728de.mock.pstmn.io/api/members"));

  if (response.statusCode == 200) {
    // If the server did return a 200 OK response,
    // then parse the JSON.
    return Album.fromJson(jsonDecode(response.body));
  } else {
    // If the server did not return a 200 OK response,
    // then throw an exception.
    throw Exception('Failed to load data');
  }
}

class Album {
  final int count;
  final List<Data> data;

  const Album({
    // required this.u_username,
    required this.count,
    required this.data,
  });

  factory Album.fromJson(Map<String, dynamic> json) {
    var list = json['data'] as List;
    print(list.runtimeType);
    List<Data> dataList = list.map((i) => Data.fromJson(i)).toList();

    return Album(count: json['count'], data: dataList);
  }
}

class Data {
  final String u_username;
  final String u_name;
  final String u_email;
  final String u_phone;
  final String u_birth;
  final String u_sub;

  Data({
    required this.u_username,
    required this.u_name,
    required this.u_email,
    required this.u_phone,
    required this.u_birth,
    required this.u_sub,
  });

  factory Data.fromJson(Map<String, dynamic> json) {
    return Data(
        u_username: json['u_username'],
        u_name: json['u_name'],
        u_email: json['u_email'],
        u_phone: json['u_phone'],
        u_birth: json['u_birth'],
        u_sub: json['u_sub']);
  }
}

//
// class Album {
//   final int userId;
//   final int id;
//   final String title;
//   // final String u_username;
//
//   const Album({
//     // required this.u_username,
//     required this.userId,
//     required this.id,
//     required this.title,
//   });
//
//   factory Album.fromJson(Map<String, dynamic> json) {
//     return Album(
//       // u_username: json['u_username'],
//       userId: json['userId'],
//       id: json['id'],
//       title: json['title'],
//     );
//   }
// }

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp>
{
  late Future<Album> futureAlbum;

  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fetch Data Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Fetch Data Example'),
        ),
        body: Center(
          child: FutureBuilder<Album>(
            future: futureAlbum,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data!.data[0].u_sub);
              } else if (snapshot.hasError) {
                return Text('${snapshot.error}');
              }

              // By default, show a loading spinner.
              return const CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

 

 

 

[아키텍처 패턴]

 

모델: 내부 비즈니스 알고리즘, /DB 와 상호 작용/ 데이터 등등

 

 

서비스,컨트롤러:   모델과 븉의 업데이트를 요청하는 부분,

 

뷰: 컨트롤러에 종속