20일차 과제 - rlatkddbs99/Flutter GitHub Wiki
새로고침 해도 남아있는 데이터 진짜 애뮬 오류 때문에 하루종일 걸림 코드를 고친게 없는데 마지막엔 왜 되는거죠;;
main.dart
import 'package:flutter/material.dart';
import 'package:save/pages/MainPage.dart';
import 'OptionCard.dart';
void main() {
runApp(const KioskApp());
}
class KioskApp extends StatelessWidget {
const KioskApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MainPage(),
);
}
}
MainPage.dart
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:save/OptionCard.dart';
import 'package:save/pages/AdminPage.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MainPage extends StatefulWidget {
const MainPage({super.key});
@override
State<MainPage> createState() => _MyAppState();
}
class _MyAppState extends State<MainPage> {
List<String> myMenu = [];
Dio dio = Dio();
SharedPreferences? prefs;
initPreferences() async {
prefs = await SharedPreferences.getInstance(); //저장소 가져오기
if (prefs != null) {
//널인지 체크 위에서 ?로 널 세이프티 해줘서
var myList =
prefs!.getStringList('myMenuList'); //리스트 형태로 데이터(myMenuList)가 있는지
myMenu = myList ?? []; //있으면 그거 그냥 사용, 없으면 빈껍데기
setState(() {
//새로고침
});
}
}
@override
void initState() {
// TODO: implement initState
super.initState();
initPreferences();
}
Future<List<dynamic>> getData() async {
var res = await dio
.get("http://52.79.115.43:8090/api/collections/options/records");
if (res.statusCode == 200) {
return res.data["items"];
}
return [];
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: myMenu.isNotEmpty
? FloatingActionButton.extended(
onPressed: () {
setState(() => myMenu = []);
},
label: Text("결제하기"),
)
: null,
appBar: AppBar(
backgroundColor: Colors.white,
title: GestureDetector(
onDoubleTap: () {
Navigator.push(context,
MaterialPageRoute(builder: ((context) => AdminPage())));
},
child: Text("분식왕 이테디 주문하기")),
foregroundColor: Colors.black,
elevation: 0,
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"주문리스트",
style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold),
),
Container(
alignment: Alignment.center,
height: 50,
child: myMenu.isNotEmpty
? ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: myMenu.length,
itemBuilder: ((context, index) {
return Chip(
label: Text(myMenu[index]),
onDeleted: () {
myMenu.removeAt(index);
setState(() {});
},
);
}))
: Text("주문한 옵션이 없습니다"),
),
SizedBox(
height: 8,
),
Text("음식",
style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold)),
Expanded(
child: FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return GridView.builder(
itemCount: snapshot.data?.length ?? 0,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemBuilder: ((context, index) {
return OptionCard(
imgUrl: snapshot.data![index]['imageUrl'],
foodName: snapshot.data![index]['menu'],
onTap: () {
if (prefs != null) {
prefs!.setStringList('myMenuList', myMenu);
}
myMenu.add(snapshot.data![index]['menu']);
setState(() {});
});
}),
);
}
return CircularProgressIndicator();
},
),
)
],
),
);
}
}
OptionCard.dart
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
class OptionCard extends StatelessWidget {
const OptionCard(
{super.key,
required this.imgUrl,
required this.foodName,
required this.onTap});
final String imgUrl;
final String foodName;
final Function() onTap;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Card(
margin: EdgeInsets.all(4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: Image.network(
imgUrl,
fit: BoxFit.cover,
),
),
Text(foodName),
Text("담기"),
],
),
),
);
}
}