본문 바로가기

Flutter/Widget

[Widget] MaterialStateProperty of Button

✔️ State 에 따라서 Button의 state에 맞는 시각적인 요소를 지정할 수 있다.

 

Material Design에서 지정하고 있는 버튼의 상태

 

- enabled : 상호작용 가능한 버튼 상태

- pressed : 사용자가 탭 했을 때

- hover : 사용자가 마우스 커서를 상호작용 가능한 버튼 위에 올려두었을 때

- focus : 사용자가 키보드나 음성과 같은 입력 방법을 사용해서 강조표시한 상태 

- disable : 상호작용 불가한 버튼 상태

 

 

State별로 버튼 시각적 요소 지정

 

1) MaterialStateProperty.resolvewith : State 별로 상태 변화를 지정할 수 있다.

 

(개인적인 코드 방식)

ElevatedButton( 
  style: ButtonStyle( 
    backgroundColor: MaterialStateProperty.resolveWith(getColor), 
  ), 
)

 static Color getColor(Set<MaterialState> states){ 
   if (states.contains(MaterialState.hovered)){ 
     return color['hover']; 
   } 
   else if (states.contains(MaterialState.pressed) || states.contains(MaterialState.focused)){
     return color['pressed']; 
   } 
   else if (states.contains(MaterialState.disabled)){ 
     return color['disable']; 
   } 
   else { 
     return color['basic']; 
   } 
 }

 

(공식 Document)

ElevatedButton( 
  style: ButtonStyle( 
    backgroundColor: MaterialStateProperty.resolveWith<Color>( (Set<MaterialState> states) { 
      if (states.contains(MaterialState.pressed)) 
        return Theme.of(context).colorScheme.primary.withOpacity(0.5); 
      }, 
    ), 
  ), 
)

return null; // Use the component's default.

 

2) MaterialStateProperty.all : 모든 state에 똑같은 값을 지정한다.

 

ElevatedButton( 
  style: ButtonStyle( 
    backgroundColor: MaterialStateProperty.all<Color>(Colors.green), 
  ), 
)

 

3) MaterialStateProperty.resolveAs : 하나의 state에 대해서만 상태 변화 지정

 

 

https://material.io/design/interaction/states.html#pressed

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

 

MaterialStateProperty class - material library - Dart API

Interface for classes that resolve to a value of type T based on a widget's interactive "state", which is defined as a set of MaterialStates. Material state properties represent values that depend on a widget's material "state". The state is encoded as a s

api.flutter.dev

 

Material Design

Build beautiful, usable products faster. Material Design is an adaptable system—backed by open-source code—that helps teams build high quality digital experiences.

material.io

 

'Flutter > Widget' 카테고리의 다른 글

[Widget] LayoutBuilder  (0) 2021.12.20
[Widget] Material Widget  (0) 2021.12.09
[Widget] Is there a way to load async data on initState method?  (0) 2021.12.07
[Widget] CheckBox  (0) 2021.11.30
[Widget] TextField, TextFormField (validate)  (0) 2021.11.30