name27 / flutter

0 stars 0 forks source link

JSON 네트워크 데이터 fromMap으로 가져오기 operator== #90

Open name27 opened 1 year ago

name27 commented 1 year ago

image

main.dart

import 'package:flutter/material.dart';
import 'package:json_class_app/assignment23_page.dart';

void main() {
  runApp(const MyApp());
}
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Assignment23(),
    );
  }
}

assignment23_page.dart

import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:json_class_app/model/userdata.dart';

class Assignment23 extends StatefulWidget {
  const Assignment23({super.key});
  @override
  State<Assignment23> createState() => _Assignment23State();
}

class _Assignment23State extends State<Assignment23> {
  Future<Map<String, dynamic>> getJsonData() async {
    var dio = Dio();
    var res = await dio.get(
        'https://sfacassignment23-default-rtdb.europe-west1.firebasedatabase.app/.json');
    if (res.statusCode == 200) {
      return res.data;
    }
    return {};
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('23일차 과제')),
      body: Center(
          child: FutureBuilder(
              future: getJsonData(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return const CupertinoActivityIndicator();
                }
                if (!snapshot.hasData) return const Text("데이터가 없습니다");

                Map<String, dynamic> data =
                    snapshot.data as Map<String, dynamic>;
                List<dynamic> users = data['users'];
                List<dynamic> dismissDuplicatedUsers =
                    _dismissDuplicatedData(users);
                return ListView.separated(
                  itemBuilder: (context, index) {
                    UserData userData =
                        UserData.fromMap(dismissDuplicatedUsers[index]);
                    return _buildItemWidget(userData);
                  },
                  separatorBuilder: (context, index) {
                    return const Divider();
                  },
                  itemCount: dismissDuplicatedUsers.length,
                );
              })),
    );
  }

  Widget _buildItemWidget(UserData userData) {
    return ListTile(
      leading: Image.network(userData.imageUrl),
      title: Text('${userData.firstName} ${userData.lastName}'),
      subtitle: Text('${userData.phoneNumber}'),
    );
  }

  List<dynamic> _dismissDuplicatedData(List<dynamic> data) {
    List<dynamic> result = data;
    for (int i = 0; i < data.length; i++) {
      for (int j = 0; j < data.length; j++) {
        if (result[i]["userId"] == data[j]["userId"]) {
          result.removeAt(j);
          break;
        }
      }
    }
    return result;
  }
}

userdata.dart

class UserData {
  String firstName;
  String imageUrl;
  String lastName;
  String phoneNumber;
  int userId;

  UserData(
      {required this.firstName,
      required this.imageUrl,
      required this.lastName,
      required this.phoneNumber,
      required this.userId});

  UserData.fromMap(Map<String, dynamic> map)
      : firstName = map["firstName"],
        imageUrl = map["imageUrl"],
        lastName = map["lastName"],
        phoneNumber = map["phoneNumber"],
        userId = map["userId"];

  @override
  operator ==(Object other) {
    return userId == other;
  }
}
name27 commented 1 year ago

+

List<dynamic> _dismissDuplicatedData(List<dynamic> data) {
    List<dynamic> result = data;
    bool isSet = false;
    for (int i = 0; i < data.length; i++) {
      for (int j = 0; j < data.length; j++) {
        if (result[i]["userId"] == data[j]["userId"]) {
          if (isSet) {
            result.removeAt(j);
          }
          isSet = true;
        }
      }
      isSet = false;
    }
    return result;
  }