Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- dart
- livedata
- Java
- Android
- UWP
- Kotlin
- Django REST framework
- 안드로이드
- android push
- kodility
- 알고리즘
- Rxjava2
- flutter firestore
- Flutter TextField
- mfc
- C
- NDK
- C++
- C/C++
- Django REST
- FLUTTER
- 코틀린
- Android P
- RxAndroid
- 프로그래머스
- 안드로이드 구글맵
- RxJava
- Django REST Android
- Python
- android architecture component
Archives
- Today
- Total
개발하는 두더지
Flutter - TextField를 이용하여 로그인 페이지 구현하기(2) 본문
ButtonBar
를 이용하면 버튼의 배치를 쉽게 할 수 있습니다.
ButtonBar
위젯을 만들고 내부에 Button 위젯들을 넣어주면 수평으로 배치해줍니다.
버튼에는 FlatButton
과 RaisedButton
이 있습니다.
각각 Material 가이드라인에서 TextButton
과 Contained Button
으로 설명하고 있습니다.
하나는 버튼의 배경색이 없이 텍스트만있고, 다른 하나는 버튼의 배경색과 텍스트로 이루어져 있습니다.
왜 이렇게 나눠놨을까요? Material 가이드라인에 따르면 하나의 레이아웃에는 눈에 띄는 버튼이 있어야 한다고 합니다.
눈에 잘 띄는 버튼은 사용자가 앱을 통해 진행하기를 바라는 행동을 나타낸다고 하는데 그런 의미에서 버튼 위젯을 나눈 것이라 생각합니다.
TextEditingController
를 이용하여 취소 버튼을 눌렀을 때 사용자가 입력한 id, pw가 지워지도록 구현하고,Navigator
의 pop
을 이용하여 Next 버튼을 클릭하면 네이게이션 스택에서 현재 페이지 ( Flutter에서는 route
라 불림)을
제거합니다. 그러면 다음 페이지로 이동하는 효과를 얻을 수 있습니다.
resizeToAvoidBottomInset
이 값의 default 값은 true
인데 body나 scaffold 위젯이 높이가 정의된 스크린 키보드에 의해 스스로 크기를 재조정한다는 의미합니다.
import 'package:flutter/material.dart';
class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 24.0),
children: <Widget>[
SizedBox(height: 80.0),
Column(
children: <Widget>[
Image.asset('assets/diamond.png'),
SizedBox(height: 16.0),
Text('SHRINE'),
],
),
SizedBox(height: 120.0),
TextField(
controller: _usernameController,
decoration: InputDecoration(
filled: true,
labelText: 'Username',
),
),
SizedBox(height: 12.0),
TextField(
controller: _passwordController,
decoration: InputDecoration(
filled: true,
labelText: 'Password',
),
obscureText: true,
),
ButtonBar(
children: <Widget>[
FlatButton(
child: Text('CANCEL'),
onPressed: () {
_usernameController.clear();
_passwordController.clear();
},
),
RaisedButton(
child: Text('NEXT'),
onPressed: () {
Navigator.pop(context);
},
),
],
),
],
),
),
);
}
}
import 'package:flutter/material.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('You did it!'),
),
resizeToAvoidBottomInset: false,
);
}
}
class ShrineApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Shrine',
home: HomePage(),
initialRoute: '/login',
onGenerateRoute: _getRoute,
);
}
Route<dynamic> _getRoute(RouteSettings settings) {
if (settings.name != '/login') {
return null;
}
return MaterialPageRoute<void>(
settings: settings,
builder: (BuildContext context) => LoginPage(),
fullscreenDialog: true,
);
}
}
'Flutter' 카테고리의 다른 글
Flutter - font와 label 스타일 변경하기 (0) | 2019.05.10 |
---|---|
Flutter - CardView 구현하기 (0) | 2019.05.08 |
Flutter - TextField를 이용하여 로그인 페이지 구현하기(1) (0) | 2019.04.28 |
Flutter - Firestore 라이브러리 사용하기 (3) (1) | 2019.04.26 |
Flutter - Firestore 라이브러리 사용하기 (2) (0) | 2019.04.26 |
Comments