개발이 좋아서/Flutter가 좋아서
[flutter] 랜덤숫자 생성기
zoaseo
2023. 1. 3. 13:43
1)

2) component/number_row.dart
import 'package:flutter/material.dart';
class NumberRow extends StatelessWidget {
final int number;
const NumberRow({
Key? key,
required this.number,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Row(
children: number
.toInt()
.toString()
.split('')
.map((e) => Image.asset(
'asset/img/$e.png',
width: 50.0,
height: 70.0,
))
.toList(),
);
}
}
3) constant/color.dart
import 'package:flutter/material.dart';
const Color PRIMARY_COLOR = Color(0xFF2D2D33);
const Color RED_COLOR= Color(0xFFEA4955);
const Color BLUE_COLOR = Color(0xFF549FBF);
4) screen/
home_screen.dart
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:random_number_generator/constant/color.dart';
import 'package:random_number_generator/screen/settings_screen.dart';
import '../component/number_row.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int maxNumber = 1000;
List<int> randomNumbers = [
123,
456,
789,
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: PRIMARY_COLOR,
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_Header(
onPressed: onSettingsPop,
),
_Body(
randomNumbers: randomNumbers,
),
_Footer(
onPressed: onRandomNumberGenerate,
),
],
),
),
),
);
}
void onRandomNumberGenerate() {
final rand = Random();
final Set<int> newNumbers = {};
while (newNumbers.length != 3) {
final number = rand.nextInt(maxNumber);
newNumbers.add(number);
}
setState(() {
randomNumbers = newNumbers.toList();
});
}
void onSettingsPop() async {
// list - add
// [HomeScreen(), SettingsScreen()]
final int? result = await Navigator.of(context).push<int>(
MaterialPageRoute(
builder: (BuildContext context) {
return SettingsScreen();
},
),
);
if (result != null) {
setState(() {
maxNumber = result;
});
}
}
}
class _Header extends StatelessWidget {
final VoidCallback onPressed;
const _Header({
Key? key,
required this.onPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'랜덤숫자 생성기',
style: TextStyle(
color: Colors.white,
fontSize: 30.0,
fontWeight: FontWeight.w700,
),
),
IconButton(
onPressed: onPressed,
icon: Icon(
Icons.settings,
color: RED_COLOR,
),
),
],
);
}
}
class _Body extends StatelessWidget {
final List<int> randomNumbers;
const _Body({
required this.randomNumbers,
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: randomNumbers
.asMap()
.entries
.map(
(x) => Padding(
padding: EdgeInsets.only(bottom: x.key == 2 ? 0 : 16.0),
child: NumberRow(
number: x.value,
),
),
)
.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(
'생성하기',
),
),
);
}
}
settings_screen.dart
import 'package:flutter/material.dart';
import 'package:random_number_generator/component/number_row.dart';
import 'package:random_number_generator/constant/color.dart';
class SettingsScreen extends StatefulWidget {
const SettingsScreen({Key? key}) : super(key: key);
@override
State<SettingsScreen> createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
double maxNumber = 1000;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: PRIMARY_COLOR,
body: Center(
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_Body(maxNumber: maxNumber),
_Footer(
maxNumber: maxNumber,
onSliderChanged: onSliderChanged,
onButtonPressed: onButtonPressed,
),
],
),
),
),
),
);
}
void onSliderChanged(double val) {
setState(
() {
maxNumber = val;
},
);
}
void onButtonPressed() {
Navigator.of(context).pop(maxNumber.toInt());
}
}
class _Body extends StatelessWidget {
final double maxNumber;
const _Body({
Key? key,
required this.maxNumber,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
child: NumberRow(
number: maxNumber.toInt(),
),
);
}
}
class _Footer extends StatelessWidget {
final double maxNumber;
final ValueChanged<double>? onSliderChanged;
final VoidCallback onButtonPressed;
const _Footer({
Key? key,
required this.maxNumber,
this.onSliderChanged,
required this.onButtonPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Slider(
value: maxNumber,
min: 1000,
max: 100000,
onChanged: onSliderChanged),
ElevatedButton(
onPressed: onButtonPressed,
style: ElevatedButton.styleFrom(
primary: RED_COLOR,
),
child: Text(
'저장!',
),
)
],
);
}
}
5)

