30일차 과제 - rlatkddbs99/Flutter GitHub Wiki

Android Emulator - flutter_emulator_5554 2023-03-07 14-49-06

main.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rx/model/coincontroller.dart';
import 'package:rx/page/mainPage.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    Get.put(CoinController(coin: 0.obs));   //메모리에 저장시키기
    return GetMaterialApp(
      home: mainPage(),
    );
  }
}

model/coinController.dart

import 'dart:async';

import 'package:get/get.dart';

class CoinController extends GetxController {
  RxInt coin;      //반응형으로 변수 만들기

  CoinController({required this.coin});

  @override
  void onInit() {      //데이터 변경될 때 재정의
    super.onInit();    
    Timer.periodic(Duration(seconds: 1), (timer) {   //1초마다 증가
      coin.value++;                        //coin자체 ++안돼 coin.value로 접근해서 증가 가능
    });

    ever(coin, (data) {
      if (data != 0 && data % 10 == 0) {           //10개마다 snackBar찍기
        Get.snackbar("코인 ${coin.value} 개 돌파", "축하합니다",
            snackPosition: SnackPosition.TOP);
      }
    });
  }
}

page/mainPage.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:get/get.dart';
import 'package:rx/model/coincontroller.dart';
import 'package:rx/page/store.dart';

class mainPage extends StatefulWidget {
  const mainPage({super.key});

  @override
  State<mainPage> createState() => _mainPageState();
}

class _mainPageState extends State<mainPage> {
  @override
  Widget build(BuildContext context) {
    var controller = Get.find<CoinController>();      //controller에 선언한 컨트롤러 가져오기
    return Scaffold(
      body: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Obx(() => Text("Current coin : ${controller.coin.value.toString()}")),    //반응형으로 바로바로 보일 수 있도록, .value로 접근
          Image.network(        // coin아이콘 안보여서
            "https://img.freepik.com/premium-vector/the-bitcoin-icon-payment-symbol-the-cryptocurrency-logo-a-simple-vector-on-a-white-background_422344-1425.jpg?w=2000",
            width: 150,
            height: 150,
          ),
          TextButton(
              onPressed: () {
                Get.to(Store());     //페이지 라우팅
              },
              child: Text("상점으로 이동하기"))
        ],
      )),
    );
  }
}

page/store.dart

import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:get/get.dart';
import 'package:rx/model/coincontroller.dart';

class Store extends StatefulWidget {
  const Store({super.key});

  @override
  State<Store> createState() => _StoreState();
}

class _StoreState extends State<Store> {
  @override
  Widget build(BuildContext context) {
    var controller = Get.find<CoinController>();        //controller가져오기
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("상점"),
            SizedBox(
              height: 4,
            ),
            Obx(() => Text("현재 보유한 코인: ${controller.coin.value.toString()}")),     //코인개수 가져오기 .value
            TextButton(
                onPressed: () {
                  controller.coin.value = 0;    //coin개수 초기화 0으로
                },
                child: Text("코인 리셋"))
          ],
        ),
      ),
    );
  }
}
⚠️ **GitHub.com Fallback** ⚠️