๊ฐœ๋ฐœํ•˜๊ธฐ/Flutter Start

Flutter_18. DialogAlert, Slider Function, Size, List, Switch

uraon 2023. 5. 10. 02:23
728x90
๋ฐ˜์‘ํ˜•

 

์ง€๋‚œ ํฌ์ŠคํŒ…์— ์ด์–ด ์˜ค๋Š˜๋„ Function ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด๊ณ , ํ•ด์•ผํ•  ์ฒดํฌ ํ•ญ๋ชฉ์„ ํ™•์ธํ•˜์ž :)

๐ŸŒฟ ์ฒดํฌ ํ•ญ๋ชฉ
โœ… Detail Page์—์„œ๋งŒ Play ํ™”๋ฉด์— ์ง„์ž… ๊ฐ€๋Šฅ, Detail Page์— ์ถœ๋ ฅ์ค‘์ธ ์ด๋ฏธ์ง€๋ฅผ Play ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜์—ฌ ์‚ฌ์šฉ
โœ… SwitchImageChange : ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ(์ž‘ํ’ˆ/์•„ํ‹ฐ์ŠคํŠธ)
โœ… SwitchImageSize : ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ(์ž‘๊ฒŒ/ํฌ๊ฒŒ) & ์Šค์œ„์น˜ Label ๋ณ€๊ฒฝ(Size-Max/Size-Min)
โœ… SwitchImageShow : ์ด๋ฏธ์ง€ ์ถœ๋ ฅ ์—ฌ๋ถ€ ์„ค์ •(๋…ธ์ถœ/๋น„๋…ธ์ถœ), ๋น„๋…ธ์ถœ์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜์—ญ Color ํ‘œ์‹œ, ๋…ธ์ถœ์ผ ๊ฒฝ์šฐ์—๋งŒ 1๋ฒˆ ๊ฐ€๋Šฅ
4) SliderSize : ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ 6๋‹จ๊ณ„(0~5) ์˜ต์…˜์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์กฐ์ ˆ
5) SliderRotation : ์ด๋ฏธ์ง€ ๊ฐ๋„๋ฅผ 0~360๋„ ๋‚ด์—์„œ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ ˆ

 

https://api.flutter.dev/flutter/material/Slider-class.html

 

Slider class - material library - Dart API

A Material Design slider. Used to select from a range of values. The Sliders value is part of the Stateful widget subclass to change the value setState was called. link To create a local project with this code sample, run: flutter create --sample=material.

api.flutter.dev

 

 

 

 

 


Figma Case Check, AlertDialog

 

 

 

1) Figma - ๋‚จ์•„ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ฒดํฌ

โŠ Switch Function โŠ
1. _showAlertTurnOff(BuildContext context) : Image ์Šค์œ„์น˜๋ฅผ Off ํ•˜๋Š” ๊ฒฝ์šฐ, Alert ์ถœ๋ ฅํ•˜๊ณ  ์ด๋ฏธ์ง€ ๋น„๋…ธ์ถœ ์ฒ˜๋ฆฌ

โŠ Slider Function โŠ
2. _playSliderSize() : ์Šฌ๋ผ์ด๋” Max๋ฅผ 100(%)์œผ๋กœ ๋†“๊ณ , 5๊ฐœ ๊ตฌ๊ฐ„์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ
3. _playSliderRotation() : ์Šฌ๋ผ์ด๋” Max๋ฅผ 360(º)๋กœ ๋†“๊ณ , 0~360๊นŒ์ง€ ์ž์œ ๋กญ๊ฒŒ ํšŒ์ „

 

 

 

2) AlertDialog ํ•จ์ˆ˜ ์ฝ”๋“œ ๋ถ™์—ฌ๋„ฃ๊ธฐ

2023.05.03 - [๊ฐœ๋ฐœํ•˜๊ธฐ] - Flutter_08. AlertDialog, Navigator, Routing, PushNamed

  // ---Function ImageShow ๋ฌผ์–ด๋ณด๊ณ  ๋„๊ธฐ
  _showAlertTurnOff(BuildContext context){

    // ํ”„๋ ˆ์ž„ ๋งŒ๋“ค๊ธฐ
    showDialog(
      // ๋ฐ˜๋“œ์‹œ ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์•ผ ์ข…๋ฃŒ์‹œํ‚ค๊ณ  ์‰ฝ๋‹ค๋ฉด, barrierDismissible false
      barrierDismissible: false,
      context: context, 
      // ๋‹ค์ด์–ด๋กœ๊ทธ ๋‚ด์šฉ ๋งŒ๋“ค๊ธฐ - ctx์— ์ €์žฅ
      builder: (BuildContext ctx){
        return AlertDialog(
          title: const Text(
            'Image Show Off',
            style: TextStyle(
              fontSize: 18,
              fontWeight: FontWeight.bold,
            ),
          ),
          content: const Text('์ด๋ฏธ์ง€๋ฅผ ๋น„๋…ธ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?'),
          actions: [
            // Center์— ๋†“๊ฑฐ๋‚˜, Row ๋˜๋Š” Column์„ ๋žฉํ•‘ํ•˜์—ฌ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅ!
            Center(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  TextButton(
                    onPressed: () {
                      // --- ctx ์ข…๋ฃŒ ์‹œํ‚ค๊ธฐ
                      Navigator.of(ctx).pop();
                    }, 
                    child: const Text(
                      '๋„ค',
                      ),
                    ),
                  TextButton(
                    onPressed: () {
                      // --- ctx๋งŒ ์ข…๋ฃŒ ์‹œํ‚ค๊ธฐ
                      Navigator.of(ctx).pop();
                    }, 
                    child: const Text(
                      '์•„๋‹ˆ์š”',
                      ),
                    ),
                ],
              ),
              ),
          ],
        );
      }
    );
  }

 

 

 

3) ํ•จ์ˆ˜ "_playImageShow()"์— Alert ํ•จ์ˆ˜ ์‚ฌ์šฉ

_switchImageShow ์Šค์œ„์น˜ ๊ฐ’์ด Off์ผ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋Š” ์šฐ์„  ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
ํ•ด๋‹น ์ฝ”๋“œ๋Š” Alert ์ถœ๋ ฅ ํ›„, ์‚ฌ์šฉ์ž๊ฐ€ "๋„ค" ํด๋ฆญ ์‹œ์—๋งŒ ์ ์šฉ๋˜๋„๋ก ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ์ค„ ์˜ˆ์ •์ด๋‹ค.

 

 

 

4) AlertDialog ํ•จ์ˆ˜์— button ์ด๋ฒคํŠธ ์ถ”๊ฐ€

AlertDialog 
- Yes : setState๋กœ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝ
- No : setState๋กœ _switchImageShow ๊ฐ’ ๋‹ค์‹œ true๋กœ ๋ณ€๊ฒฝ

 

 

 

 

5) ์ €์žฅํ•˜๊ณ  ํ™”๋ฉด ํ™•์ธ

 

 

๋ฐ˜์‘ํ˜•

 

 

 

 

 

Slider Function, List, Size-Min/Max

 

 

 

 

1)  ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ : 5๊ตฌ๊ฐ„(0~5)์œผ๋กœ ์„ ํƒ ์กฐ์ ˆ

์ด๋ฏธ์ง€๋ฅผ ๊ฐ๊ณ  ์žˆ๋Š” ์‚ฌ์ด์ฆˆ ๋ฐ•์Šค ํฌ๊ธฐ๊ฐ€ 350 * 350์ž„์œผ๋กœ,
Max350, Min 100๋กœ ์žก๊ณ  +50์”ฉ 0~5๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์„ ๋งŒ๋“ค ์˜ˆ์ •์ด๋‹ค.
List์— ์‚ฌ์ด์ฆˆ ๊ฐ’์„ ๋‹ด๊ณ , index ๋ณ€์ˆ˜(int)๋ฅผ ๋ณ„๋„๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
→ [0]100, [1]150, [2]200, [3]250, [4]300, [5]350
class _CardPlayState extends State<CardPlay> {
  // Field
  late double _SliderValueSize;
  late List<double> _sliderValueSizeList;
  late int _sliderValueCurrent;
 
 
  @override
  void initState() {
    super.initState();

    _SliderValueSize = 0;
    _sliderValueSizeList = [100, 150, 200, 250, 300, 350];
    _sliderValueCurrent = 0;

  }

 

 

 

2) Slider ๋ณ€์ˆ˜๋กœ ์ฝ”๋“œ ๋ณ€๊ฒฝ

ํ…Œ์ŠคํŠธ๋กœ ๋„ฃ์€ print๋ฅผ ํ™•์ธํ•ด๋ณด์ž!
- ์Šฌ๋ผ์ด๋”์— ๋“ค์–ด์˜จ value(double) ๊ฐ’์ด sliderValueSize(double) ๋ณ€์ˆ˜์— ๋“ค์–ด์˜จ๋‹ค.
- sliderValueCurrent(int) ๋ณ€์ˆ˜์— ๋“ค์–ด์˜จ sliderValueSize(double) ๊ฐ’์„ toInt()๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋„ฃ์–ด์ค€๋‹ค.
- sliderValueCurrent(int) ๋ณ€์ˆ˜๋Š” index๋กœ List์— ๋ช‡๋ฒˆ์งธ ์‚ฌ์ด์ฆˆ์ธ์ง€ ์ฒดํฌํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
max: _sliderValueSizeList.length -1,
divisions: _sliderValueSizeList.length -1,

_SliderValueSize = value;
_sliderValueCurrent = _SliderValueSize.toInt();

 

 

 

3) ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ์ ์šฉ ํ•จ์ˆ˜ ๊ตฌํ˜„

- ์Šฌ๋ผ์ด๋”์— ์žˆ๋Š” ์ฝ”๋“œ ํ•จ์ˆ˜๋กœ ์ด๋™
- Index๊ฐ€ [0]์ผ ๊ฒฝ์šฐ๋Š”, ์‚ฌ์ด์ฆˆ ์Šค์œ„์น˜{Off}์ผ ๊ฒฝ์šฐ์™€ ๋™์ผ ์‚ฌ์ด์ฆˆ์ž„์œผ๋กœ ์Šฌ๋ผ์ด๋”๊ฐ€ ์›€์ง์—ฌ 0์ผ๋•Œ, ์Šค์œ„์น˜๋„ false ์ฒ˜๋ฆฌ
- Index๊ฐ€ [5]์ผ ๊ฒฝ์šฐ๋Š”, ์‚ฌ์ด์ฆˆ ์Šค์œ„์น˜{On}์ผ ๊ฒฝ์šฐ์™€ ๋™์ผ ์‚ฌ์ด์ฆˆ์ž„์œผ๋กœ ์Šฌ๋ผ์ด๋”๊ฐ€ ์›€์ง์—ฌ MAx์ผ๋•Œ, ์Šค์œ„์น˜๋„ true ์ฒ˜๋ฆฌ  
  // ---Func4. Slider Size
  _playSliderSize(){
    _sliderValueCurrent = _sliderValueSize.toInt();
    _imageWidth = _sliderValueSizeList[_sliderValueCurrent];
    _imageHeight = _sliderValueSizeList[_sliderValueCurrent];
    // print('slider : $_sliderValueSize');
    // print('index : $_sliderValueCurrent');
    // print('size : ${_sliderValueSizeList[_sliderValueCurrent]}');     
    
    // *** Slider Min Value{100} = Switch Label{Size-Min}
    if(_sliderValueCurrent == 0){
      _switchImageSizeLabel = 'Size-Min';
      _switchImageSize = false;
    }
    // *** Slider Max Value{350} = Switch Label{Size-Max}
    if(_sliderValueCurrent == _sliderValueSizeList.length-1){
      _switchImageSizeLabel = 'Size-Max';
      _switchImageSize = true;
    }    
  }

 

 

 

 

4) ์ €์žฅํ•˜๊ณ  ๊ธฐ๋Šฅ ํ™•์ธ

 

 

 

5) ์Šค์œ„์น˜์—๋„ ๋™์ผํ•˜๊ฒŒ ์Šฌ๋ผ์ด๋” ๊ฐ’ ๋ณ€๊ฒฝ ์ฝ”๋“œ ์ถ”๊ฐ€ :)

๋ณด๋‹ค๋ณด๋‹ˆ, ์˜ˆ์ „์— ๋งŒ๋“  ์‚ฌ์ด์ฆˆ ํ•จ์ˆ˜์— ์กฐ๊ฑด๋ณ„ if ๋ฌธ์˜ ์‚ฌ์ด์ฆˆ ๊ฐ’์ด ๋ฐ˜๋Œ€๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์—ˆ๋‹ค ;;
ํ•จ์ˆ˜ ์ˆ˜์ •ํ•˜๋ฉด์„œ ๊ฐ™์ด ์ˆ˜์ • :) ์Šฌ๋ผ์ด๋”์™€ ์Šค์œ„์น˜ ์ดˆ๊ธฐ๊ฐ’๋„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.
    _switchImageSizeLabel = 'Size-Max';
    _switchImageSize = true;
    
    _sliderValueSize = 5;

-------------------------------------------------

// ---Func3. ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์™€ switch ์ด๋ฆ„ ๋ณ€๊ฒฝ(Min/Max)
  _playImageSize(){
    if(_switchImageSize){
      _imageWidth = 350;
      _imageHeight = 350;
      _switchImageSizeLabel = 'Size-Max';
      // *** ์Šค์œ„์น˜๊ฐ€ ON์ด๋ฉด, ์Šฌ๋ผ์ด๋”๋„ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ™์ด ๋ณ€๊ฒฝ
      _sliderValueSize = 5;
    }else{
      _imageWidth = 100;
      _imageHeight = 100;
      _switchImageSizeLabel = 'Size-Min';
      // *** ์Šค์œ„์น˜๊ฐ€ OFF๋ฉด, ์Šฌ๋ผ์ด๋”๋„ 0 ๊ฐ’์œผ๋กœ ๊ฐ™์ด ๋ณ€๊ฒฝ
      _sliderValueSize = 0; 
    }
  }

 

 

 

 

6) ์ €์žฅํ•˜๊ณ  ๊ธฐ๋Šฅ ํ™•์ธ

 

 

 

 

 

 

 

Slider Function, 360, Rotation

 

 

 

1) Slider division : 360์œผ๋กœ ๋ณ€๊ฒฝ

0~360๊นŒ์ง€ 1 ๋‹จ์œ„๋กœ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ๊ฐ„ ๊ฐœ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
    Slider(
      activeColor: const Color.fromARGB(255, 134, 98, 243),
      value: _SliderValueRotation,
      max: 360,
      divisions: 360,
      label: _SliderValueRotation.round().toString(),
      onChanged: (value) {
        // --- Slider Event
        setState(() {
          _SliderValueRotation = value;
        });
      },
    ),

 

 

 

2) Image์— RotationTransition

RotationTransition(
  turns: AlwaysStoppedAnimation(_SliderValueRotation / 360),
  SizedBox(
    width: 350,
    height: 350,
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        RotationTransition(
          turns: AlwaysStoppedAnimation(_SliderValueRotation / 360),
          child: Image.asset(
            _imagePath,
            width: _imageWidth,
            height: _imageHeight,
          ),
        ),

      ],
    ),
  ),

 

 

 

 

3) ์ €์žฅํ•˜๊ณ  ๊ธฐ๋Šฅ ํ™•์ธ

๐ŸŒฟ ์ฒดํฌ ํ•ญ๋ชฉ
โœ… Detail Page์—์„œ๋งŒ Play ํ™”๋ฉด์— ์ง„์ž… ๊ฐ€๋Šฅ, Detail Page์— ์ถœ๋ ฅ์ค‘์ธ ์ด๋ฏธ์ง€๋ฅผ Play ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜์—ฌ ์‚ฌ์šฉ
โœ… SwitchImageChange : ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ(์ž‘ํ’ˆ/์•„ํ‹ฐ์ŠคํŠธ)
โœ… SwitchImageSize : ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ(์ž‘๊ฒŒ/ํฌ๊ฒŒ) & ์Šค์œ„์น˜ Label ๋ณ€๊ฒฝ(Size-Max/Size-Min)
โœ… SwitchImageShow : ์ด๋ฏธ์ง€ ์ถœ๋ ฅ ์—ฌ๋ถ€ ์„ค์ •(๋…ธ์ถœ/๋น„๋…ธ์ถœ), ๋น„๋…ธ์ถœ์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜์—ญ Color ํ‘œ์‹œ, ๋…ธ์ถœ์ผ ๊ฒฝ์šฐ์—๋งŒ 1๋ฒˆ ๊ฐ€๋Šฅ
โœ… SliderSize : ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ 6๋‹จ๊ณ„(0~5) ์˜ต์…˜์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์กฐ์ ˆ
โœ… SliderRotation : ์ด๋ฏธ์ง€ ๊ฐ๋„๋ฅผ 0~360๋„ ๋‚ด์—์„œ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ ˆ

 

 

 

 

 

https://api.flutter.dev/flutter/widgets/RotationTransition-class.html

 

RotationTransition class - widgets library - Dart API

Animates the rotation of a widget. Here's an illustration of the RotationTransition widget, with it's turns animated by a CurvedAnimation set to Curves.elasticOut: link To create a local project with this code sample, run: flutter create --sample=widgets.R

api.flutter.dev

 

https://api.flutter.dev/flutter/animation/AlwaysStoppedAnimation-class.html

 

AlwaysStoppedAnimation class - animation library - Dart API

An animation that is always stopped at a given value. The status is always AnimationStatus.forward. Inheritance Constructors AlwaysStoppedAnimation(T value) Creates an AlwaysStoppedAnimation with the given value. const Properties hashCode → int The hash

api.flutter.dev

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•