[Flutter] 랜덤 숫자 생성기

내용물


    이전 기사 참조

    이전 기사에 이어 난수 생성기 앱을 만들지만 이번에는 기능을 추가하는 방법을 살펴 보겠습니다.

    (Flutter) 예쁜 숫자를 위한 난수 생성기 앱 만들기 (1)

    (Flutter) 난수 생성기 앱 만들기 (1) / Flutter 앱 프로젝트

    목차 난수 생성기 앱 만들기 이번에는 난수 생성기를 만들어 보겠습니다. 디자인 넘버가 예쁜 제너레이터를 만들기 위해서는 그 넘버에 디자인이 들어간 유저가 있어야 합니다.

    parkjh7764.tistory.com


    버튼을 클릭하면 난수 생성

    변화하는 수치변수로 관리 분리

    이전에 임의로 입력된 숫자는 이제 버튼을 클릭하면 임의로 변경되는 숫자이므로 상태로 별도로 관리됩니다.

    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: (
                        1234,
                        5678,
                        9012,
                        3456,
                      ),
                   )

    맨 위에 있는 randomNum은 무엇입니까? 변하기 쉬운난수에 해당하는 부분을 생성하여 삽입하고 향후 변수를 사용합니다.

    class _HomeScreenState extends State<HomeScreen> {
      List<int> randomNum = (
        1234,
        5678,
        9012,
        3456,
      );

    키를 누르면 난수 생성


    • 임의로() 클래스를 사용하려면 ‘dart:math’ 가져오기가 필요합니다.
    • .넥스트인트() : 난수의 최대값 지정 가능

    난수를 인쇄해 보세요.

    import 'dart:math';
    
                      onPressed: () {
                        final random = Random();
                        print(random.nextInt(100));
                      },


    setState()로 생성할 때 randomNum을 재정의합니다.

    • 5개의 for 루프를 거쳐 5행의 난수가 생성됩니다.
    • nextInt(1000000)의 숫자 아래에 난수를 생성합니다.
    • 배열 변수에 추가된 숫자는 위에서 선언한 randomNum에 기록됩니다.
                      onPressed: () {
                        final random = Random();
    
                        final List<int> newNum = ();
                        for (int i = 0; i < 5; i++) {
                          final number = random.nextInt(1000000);
                          newNum.add(number);
    
                          setState(() {
                            randomNum = newNum;
                          });
                        }
                      },

    위의 randomNum 선언 부분


    randomNum으로 숫자 분할 후 이미지 매칭 부분



    중복 난수 제거

    • 자동으로 중복 제거 문장()당신이 사용할 수있는
    • 그러나 이전과 같이 for 문을 사용하면 중복 값이 ​​발생할 때마다 제거되므로 숫자의 열 수가 줄어듭니다. 그것을 방지하기 위해 동안(newNum.Length != 5)5열이 아닌 경우 루프가 계속 실행되도록 설정합니다.
                      onPressed: () {
                        final random = Random();
    
                        final Set<int> newNum = {};
                        while(newNum.length != 5){
                          final number = random.nextInt(1000000);
                          newNum.add(number);
    
                          setState(() {
                            randomNum = newNum.toList();
                          });
                        }
                      },

    전체 코드 – home_screen.dart 파일

    // ignore_for_file: prefer_const_constructors
    import 'dart:math';
    
    import 'package:app_random_number_generaotr/constant/color.dart';
    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatefulWidget {
      const HomeScreen({super.key});
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      List<int> randomNum = ();
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: primary_color,
          body: SafeArea(
            child: Padding(
              padding: const EdgeInsets.symmetric(
                vertical: 8,
                horizontal: 16,
              ),
              child: Column(
                children: (
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: (
                      Text(
                        ' ⚡ NUMBER MAKER',
                        style: TextStyle(
                          color: white_color,
                          fontSize: 25,
                        ),
                      ),
                      IconButton(
                        onPressed: () {},
                        icon: Icon(
                          Icons.android_sharp,
                          color: green_color,
                        ),
                      )
                    ),
                  ),
                  Expanded(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: randomNum
                          .asMap()
                          .entries
                          .map(
                            (x) => Padding(
                              padding: EdgeInsets.only(bottom: x.key == 3 ? 0 : 10),
                              child: Row(
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: x.value
                                    .toString()
                                    .split('')
                                    .map((x) => Image.asset(
                                          'asset/img/$x.png',
                                          width: 40,
                                          height: 60,
                                        ))
                                    .toList(),
                              ),
                            ),
                          )
                          .toList(),
                    ),
                  ),
                  SizedBox(
                    width: double.infinity,
                    child: ElevatedButton(
                      style: ElevatedButton.styleFrom(
                        primary: red_color,
                      ),
                      onPressed: () {
                        final random = Random();
    
                        final Set<int> newNum = {};
                        while (newNum.length != 5) {
                          final number = random.nextInt(1000000);
                          newNum.add(number);
    
                          setState(() {
                            randomNum = newNum.toList();
                          });
                        }
                      },
                      child: Text('랜덤숫자 생성'),
                    ),
                  )
                ),
              ),
            ),
          ),
        );
      }
    }


    코드 최적화 – home_screen.dart 파일

    // ignore_for_file: prefer_const_constructors
    import 'dart:math';
    
    import 'package:app_random_number_generaotr/constant/color.dart';
    import 'package:flutter/material.dart';
    
    class HomeScreen extends StatefulWidget {
      const HomeScreen({super.key});
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
      List<int> randomNum = ();
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: primary_color,
          body: SafeArea(
            child: Padding(
              padding: const EdgeInsets.symmetric(
                vertical: 8,
                horizontal: 16,
              ),
              child: Column(
                children: (
                  _Hearder(),
                  _Body(randomNum: randomNum),
                  _Footer(onPressed: onRandomNumberGenerator),
                ),
              ),
            ),
          ),
        );
      }
    
      void onRandomNumberGenerator() {
        final random = Random();
    
        final Set<int> newNum = {};
        while (newNum.length != 5) {
          final number = random.nextInt(1000000);
          newNum.add(number);
    
          setState(() {
            randomNum = newNum.toList();
          });
        }
      }
    }
    
    class _Hearder extends StatelessWidget {
      const _Hearder({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: (
            Text(
              ' ⚡ NUMBER MAKER',
              style: TextStyle(
                color: white_color,
                fontSize: 25,
              ),
            ),
            IconButton(
              onPressed: () {},
              icon: Icon(
                Icons.android_sharp,
                color: green_color,
              ),
            )
          ),
        );
      }
    }
    
    class _Body extends StatelessWidget {
      final List<int> randomNum;
    
      const _Body({required this.randomNum, Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Expanded(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: randomNum
                .asMap()
                .entries
                .map(
                  (x) => Padding(
                    padding: EdgeInsets.only(bottom: x.key == 3 ? 0 : 10),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: x.value
                          .toString()
                          .split('')
                          .map((x) => Image.asset(
                                'asset/img/$x.png',
                                width: 40,
                                height: 60,
                              ))
                          .toList(),
                    ),
                  ),
                )
                .toList(),
          ),
        );
      }
    }
    
    class _Footer extends StatelessWidget {
      final VoidCallback onPressed;
      const _Footer({
        required this.onPressed,
        Key? key,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          width: double.infinity,
          child: ElevatedButton(
            style: ElevatedButton.styleFrom(
              primary: red_color,
            ),
            onPressed: onPressed,
            child: Text('랜덤숫자 생성'),
          ),
        );
      }
    }