카테고리 없음
16일차 과제
신승호.
2023. 2. 19. 11:08
- 다음의 URL에 데이터를 요청하여 문제를 해결합니다.
- 디바이스가 인터넷에 연결돼있는지 확인하는 패키지를 사용합니다.
- 패키지명 : connectivity_plus
- FAB을 누르면 인터넷이 연결되어있는지 확인합니다.
- 인터넷 연결을 확인중일 때 “인터넷 확인중입니다”와 로딩 위젯을 보여줍니다.
- 이 때, 로딩 위젯은 어떠한 것이든 상관없습니다.
- 화면을 아래로 당기면 데이터를 새로 요청할 수 있도록 패키지를 사용합니다.
- 패키지명 : pull_to_refresh
- 데이터를 가져올 때 사용자에게 데이터가 로딩중이라는 것을 알려줄 수 있도록 패키지를 활용합니다.
- 패키지명 : Shimmer
- 위 기능을 우선적으로 구현하며, 최대한 자연스러운 UX를 구현할 수 있도록 합니다. 그 외 과제를 위한 기능 및 디자인은 자유입니다.
dio를 모르겠다;;
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
connectivity_plus: ^3.0.3
pull_to_refresh: ^2.0.0
shimmer: ^2.0.0
flutter_spinkit: ^5.1.0
dio: ^5.0.0
우선 위에 패키지들을 사용했다.
16일차에 배운 내용 이용할거같아서
네트워크를 체크안하고있을 때 ? 강아지화면 : 하고있을 때 로딩화면을 하고싶었고
그 안에 로딩중일 때 ? ShimmerBox화면 : 안하고 있을때 강아지화면을 하고싶었는데 이렇게 하는게 아닌갑다ㅋㅋ
import 'package:assigment16/ShimmerBox.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MainPage(),
);
}
}
class MainPage extends StatefulWidget {
const MainPage({super.key});
@override
State<MainPage> createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
late Future res;
var dio = Dio();
bool isLoading = false; //bool타입있어야해서 해봄
bool isNetworkCheck = false;
final RefreshController_refreshController =
RefreshController(initialRefresh: false);
Future getData() async {
var url = 'https://sfacassignment-default-rtdb.firebaseio.com/.json';
var res = await dio.get(url);
isLoading = false;
return res.data['body'];
}
@override
void initState() {
super.initState();
res = getData();
}
void checknetwork() async {
final connectivityResult = await (Connectivity().checkConnectivity());
await Future.delayed(Duration(seconds: 2));
if (connectivityResult == ConnectivityResult.mobile ||
connectivityResult == ConnectivityResult.wifi) { //모바일또는 와이파이연결됐을때
res = getData();
}
setState(() {});
}
void _onRefresh() async {
setState(() {});
await Future.delayed(Duration(milliseconds: 500));
setState(() {checknetwork()});
RefreshController_refreshController.refreshCompleted();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('16일차 과제 2번'),
),
body: isNetworkCheck
? FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if(snapshot.hasdata){
return SmartRefresher(
enablePullDown: true,
controller: RefreshController_refreshController,
onRefresh: _onRefresh,
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 5,
crossAxisSpacing: 5),
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return isLoading
? Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16.0),
),
child: Column(
children: [
Expanded(
child: Container(
width: double.infinity,
margin: EdgeInsets.all(8.0),
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(16.0),
),
clipBehavior:
Clip.antiAliasWithSaveLayer,
child: Image.network(
snapshot.data[index]['url']
.toString(),
),
),
),
Text(
snapshot.data[index]['msg'].toString(),
),
Container(
alignment: Alignment.centerLeft,
margin: EdgeInsets.all(16.0),
child: Icon(
color: Colors.grey, Icons.comment),
),
],
),
)
: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16.0),
),
child: Column(
children: [
Expanded(child: ShimmerBox()),
SizedBox(height: 8),
ShimmerBox(),
],
),
);
}));
}})
: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('인터넷 연결 확인중입니다.'),
SpinKitThreeBounce(
color: Colors.black45,
size: 32.0,
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
checknetwork();
},
child: Icon(Icons.wifi_find),
),
);
}
}
아래는 ShimmerBox 코드인데 pub.dev 예시보고 한거다.
import 'package:flutter/material.dart';
import 'package:shimmer/shimmer.dart';
class ShimmerBox extends StatefulWidget {
const ShimmerBox({super.key});
@override
State<ShimmerBox> createState() => _ShimmerBoxState();
}
class _ShimmerBoxState extends State<ShimmerBox> {
@override
Widget build(BuildContext context) {
return SizedBox(
width: 200.0,
height: 50.0,
child: Shimmer.fromColors(
baseColor: Colors.grey,
highlightColor: Colors.yellow,
child: Container(
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(30),
))),
);
}
결과는 : 부분을 하나씩 없애면 저렇게 한 화면씩...
플러팅 버튼누르면 페이지이동하는게 아니라서 버튼부분도 어렵다..
첨부터 다시해봐야겠다