20일차 과제 - rlatkddbs99/Flutter GitHub Wiki

새로고침 해도 남아있는 데이터 진짜 애뮬 오류 때문에 하루종일 걸림 코드를 고친게 없는데 마지막엔 왜 되는거죠;;

Android Emulator - flutter_emulator_5554 2023-02-21 18-19-57

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("담기"),
          ],
        ),
      ),
    );
  }
}
⚠️ **GitHub.com Fallback** ⚠️