728x90
FutureBuilder 와 Dio 라이브러리를 이용하여 서버에 있는 데이터를 가져와서 화면에 보여주는 ListView 예제이다.
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:rest/restaurant/component/restaurant_card.dart';
import '../../common/const/data.dart';
class RestaurantScreen extends StatelessWidget {
const RestaurantScreen({Key? key}) : super(key: key);
Future<List> pagenateRestaurant() async {
final dio = Dio();
final accessToken = await storage.read(key: ACCESS_TOKEN_KEY);
//print('accessToken read ::: ${accessToken}');
final resp = await dio.get(
'http://$realIp/restaurant',
options: Options(headers: {
'authorization': 'Bearer $accessToken',
}),
);
return resp.data['data'];
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: FutureBuilder<List>(
future: pagenateRestaurant(),
builder: (context, AsyncSnapshot<List> snapshot) {
//print(snapshot.error);
//print(snapshot.data);
if (!snapshot.hasData) {
return Container();
}
return ListView.separated(
itemCount: snapshot.data!.length,
itemBuilder: (_, index) {
final item = snapshot.data![index];
return RestaurantCard(
image: Image.network(
'http://$realIp${item['thumbUrl']}',
fit: BoxFit.cover,
),
name: item['name'],
tags: List<String>.from(item['tags']),
ratingsCount: item['ratingsCount'],
deliveryTime: item['deliveryTime'],
deliveryFee: item['deliveryFee'],
ratings: item['ratings'],
);
},
separatorBuilder: (_, index) {
return SizedBox(height: 16.0);
},
);
},
),
),
),
);
}
}
|
위 코드를 아래와 같이 Model 화하여 수정한 코드이다.
enum RestaurantPriceRange {
expensive,
medium,
cheap,
}
class RestaurantModel {
final String id;
final String name;
final String thumbUrl;
final List<String> tags;
final RestaurantPriceRange priceRange;
final double ratings;
final int ratingsCount;
final int deliveryTime;
final int deliveryFee;
RestaurantModel({
required this.id,
required this.name,
required this.thumbUrl,
required this.tags,
required this.priceRange,
required this.ratings,
required this.ratingsCount,
required this.deliveryTime,
required this.deliveryFee,
});
}
|
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:rest/restaurant/component/restaurant_card.dart';
import 'package:rest/restaurant/model/restaurant_model.dart';
import '../../common/const/data.dart';
class RestaurantScreen extends StatelessWidget {
const RestaurantScreen({Key? key}) : super(key: key);
Future<List> pagenateRestaurant() async {
final dio = Dio();
final accessToken = await storage.read(key: ACCESS_TOKEN_KEY);
//print('accessToken read ::: ${accessToken}');
final resp = await dio.get(
'http://$realIp/restaurant',
options: Options(headers: {
'authorization': 'Bearer $accessToken',
}),
);
return resp.data['data'];
}
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: FutureBuilder<List>(
future: pagenateRestaurant(),
builder: (context, AsyncSnapshot<List> snapshot) {
//print(snapshot.error);
//print(snapshot.data);
if (!snapshot.hasData) {
return Container();
}
return ListView.separated(
itemCount: snapshot.data!.length,
itemBuilder: (_, index) {
final item = snapshot.data![index];
final pItem = RestaurantModel(
id: item['id'],
name: item['name'],
thumbUrl: 'http://$realIp${item['thumbUrl']}',
tags: List<String>.from(item['tags']),
priceRange: RestaurantPriceRange.values.firstWhere(
(e) => e.name == item['priceRange'],
),
ratings: item['ratings'],
ratingsCount: item['ratingsCount'],
deliveryTime: item['deliveryTime'],
deliveryFee: item['deliveryFee'],
);
return RestaurantCard(
image: Image.network(
pItem.thumbUrl,
fit: BoxFit.cover,
),
name: pItem.name,
tags: pItem.tags,
ratingsCount: pItem.ratingsCount,
deliveryTime: pItem.deliveryTime,
deliveryFee: pItem.deliveryFee,
ratings: pItem.ratings,
);
},
separatorBuilder: (_, index) {
return SizedBox(height: 16.0);
},
);
},
),
),
),
);
}
}
|
728x90
'Flutter 앱 > Network' 카테고리의 다른 글
Flutter Login with PHP Session #1 (0) | 2023.12.24 |
---|---|
Flutter AES256 with PHP (0) | 2023.12.19 |
Flutter Login Example (0) | 2022.07.25 |
Session vs JWT (0) | 2022.07.22 |
Flutter Login 로직 구현 예제 (오류 포함) (0) | 2022.07.22 |