❮
[Flutter] 7. Flutter Widget (Expanded, GestureDetector)
20190916
간단하게 소개만 하고 넘어갑니다.
Expanded
반응형 UI를 만들기 위한 flutter의 해법.
Row, Column, Flex의 child 위젯을 가능한 최대 크기로 만들어 줍니다.
반드시 Row, Column, Flex의 후손 위젯에만 사용해야 합니다.
Expanded 위젯에서 위젯 트리 상에서 조상이 되는 Row, Column, Flex 노드 까지의 경로에는 StatelessWidgets 또는 StatefulWidget만 있어야 합니다.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Column Sample'),
),
body: Center(
child: Column(
children: <Widget>[
Container(
color: Colors.blue,
height: 100,
width: 100,
),
Expanded(
child: Container(
color: Colors.amber,
width: 100,
),
),
Container(
color: Colors.blue,
height: 100,
width: 100,
),
],
),
),
);
}
flex 속성을 이용해서 사용할 공간의 비율을 결정합니다.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Row Sample'),
),
body: Center(
child: Row(
children: <Widget>[
Expanded(
flex: 2,
child: Container(
color: Colors.amber,
height: 100,
),
),
Container(
color: Colors.blue,
height: 100,
width: 50,
),
Expanded(
flex: 1,
child: Container(
color: Colors.amber,
height: 100,
),
),
],
),
),
);
}
child 위젯에 일어나는 제스쳐 이벤트를 감지합니다.
child를 가지면 child의 크기에 맞추게 되고, child가 없다면 부모의 크기에 맞추게 됩니다.
다음은 Container를 탭하면 _lights 속성을 true로 설정하도록 하는 예시입니다.
GestureDetector(
onTap: () {
setState(() { _lights = true; });
},
child: Container(
color: Colors.yellow,
child: Text('TURN LIGHTS ON'),
),
)
거의 모든 제스쳐를 다루기 때문에 생성자가 매우 깁니다.
GestureDetector({Key key, Widget child, GestureTapDownCallback onTapDown, GestureTapUpCallback onTapUp, GestureTapCallback onTap, GestureTapCancelCallback onTapCancel, GestureTapDownCallback onSecondaryTapDown, GestureTapUpCallback onSecondaryTapUp, GestureTapCancelCallback onSecondaryTapCancel, GestureTapCallback onDoubleTap, GestureLongPressCallback onLongPress, GestureLongPressStartCallback onLongPressStart, GestureLongPressMoveUpdateCallback onLongPressMoveUpdate, GestureLongPressUpCallback onLongPressUp, GestureLongPressEndCallback onLongPressEnd, GestureDragDownCallback onVerticalDragDown, GestureDragStartCallback onVerticalDragStart, GestureDragUpdateCallback onVerticalDragUpdate, GestureDragEndCallback onVerticalDragEnd, GestureDragCancelCallback onVerticalDragCancel, GestureDragDownCallback onHorizontalDragDown, GestureDragStartCallback onHorizontalDragStart, GestureDragUpdateCallback onHorizontalDragUpdate, GestureDragEndCallback onHorizontalDragEnd, GestureDragCancelCallback onHorizontalDragCancel, GestureForcePressStartCallback onForcePressStart, GestureForcePressPeakCallback onForcePressPeak, GestureForcePressUpdateCallback onForcePressUpdate, GestureForcePressEndCallback onForcePressEnd, GestureDragDownCallback onPanDown, GestureDragStartCallback onPanStart, GestureDragUpdateCallback onPanUpdate, GestureDragEndCallback onPanEnd, GestureDragCancelCallback onPanCancel, GestureScaleStartCallback onScaleStart, GestureScaleUpdateCallback onScaleUpdate, GestureScaleEndCallback onScaleEnd, HitTestBehavior behavior, bool excludeFromSemantics: false, DragStartBehavior dragStartBehavior: DragStartBehavior.start })
특정 범위의 값을 선택할 때 사용하는 위젯.
min에서 max 사이에 있는 연속된 값을 선택합니다.
이산적인 값들을 선택할 때는 간격을 나타내는 divisions에 null이 아닌 값을 넣습니다.
예를 들어 min이 0.0, max가 50.0, divisions이 5인 경우에
0.0, 10.0, 20.0, 30.0, 40.0, 50.0 의 값을 선택할 수 있습니다.
머테리얼 Slider 의 각 부분을 나타내는 용어들은 다음과 같습니다.
- thumb : 유저가 드래그하게 되는 부분. 주로 색칠된 원, 또는 막대
- track : thumb이 움직일 수 있는 선
- value indicator : 유저가 thumb을 드래그할 때 thumb이 현재 어떤 값을 가리키는지 알려주는 모양
- active side : 슬라이더의 최소값 부터 현재 thumb이 있는 값 사이 구간
- inactive side : 현재 thumb이 있는 값에서 부터 슬라이더의 최대 값 사이의 구간
Slider의 기본 생성자는 다음과 같습니다. @required 인 속성은 value, onChanged 입니다.
Slider({Key key, @required double value, @required ValueChanged<double> onChanged, ValueChanged<double> onChangeStart, ValueChanged<double> onChangeEnd, double min: 0.0, double max: 1.0, int divisions, String label, Color activeColor, Color inactiveColor, SemanticFormatterCallback semanticFormatterCallback })
Slider 구현 예시 입니다.
setState() 를 이용해야 UI에서 슬라이더가 업데이트 됩니다.
Slider(
value: _duelCommandment.toDouble(),
min: 1.0,
max: 10.0,
divisions: 10,
label: '$_duelCommandment',
onChanged: (double newValue) {
setState(() {
_duelCommandment = newValue.round();
});
},
)