import 'package:flutter/material.dart';
import 'package:tiktok_clone/constants/gaps.dart';
import 'package:tiktok_clone/constants/sizes.dart';
class UsernameScreen extends StatefulWidget {
const UsernameScreen({super.key});
State<UsernameScreen> createState() => _UsernameScreenState();
}
class _UsernameScreenState extends State<UsernameScreen> {
final TextEditingController _usernameController = TextEditingController();
String _username = "";
void initState() {
super.initState();
_usernameController.addListener(() {
setState(() {
_username = _usernameController.text;
});
});
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(
"Sign up",
),
),
body: Padding(
padding: const EdgeInsets.symmetric(
horizontal: Sizes.size36,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Gaps.v40,
const Text(
"Create username",
style: TextStyle(
fontSize: Sizes.size24,
fontWeight: FontWeight.w700,
),
),
Gaps.v8,
const Text(
"You can always change this later.",
style: TextStyle(
fontSize: Sizes.size16,
color: Colors.black54,
),
),
Gaps.v16,
TextField(
controller: _usernameController,
decoration: InputDecoration(
hintText: "Username",
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey.shade400,
),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey.shade400,
),
),
),
cursorColor: Theme.of(context).primaryColor,
),
Gaps.v28,
FractionallySizedBox(
widthFactor: 1,
child: AnimatedContainer(
padding: const EdgeInsets.symmetric(
vertical: Sizes.size16,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(Sizes.size5),
color: _username.isEmpty
? Colors.grey.shade300
: Theme.of(context).primaryColor,
),
duration: const Duration(milliseconds: 500),
child: const Text(
'Next',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
),
),
),
),
],
),
),
);
}
}
final TextEditingController _usernameController = TextEditingController();
TextEditingController
의 인스턴스를 생성하고 _usernameController
변수에 할당합니다.TextEditingController
는 편집 가능한 텍스트 필드의 컨트롤러로, 텍스트 필드에서 사용자의 입력을 감시하고 제어합니다.String _username = "";
_username
이라는 이름의 String
변수가 선언되고 빈 문자열로 초기화됩니다. 이 변수는 텍스트 필드에서 사용자의 입력 값을 저장하기 위한 것입니다.initState
는 상태 저장 위젯의 생명주기 메서드입니다. 위젯이 생성될 때 처음으로 호출되는 메서드입니다(생성자 이후, build
이전).super.initState();
는 상위 클래스의 initState
메서드를 호출합니다. 상속받은 initState
기능이 실행되도록 보장하기 위해 필요합니다.initState
내에서 _usernameController
에 addListener
를 사용하여 리스너를 추가합니다._usernameController.addListener(() { ... });
는 텍스트 필드의 텍스트가 변경될 때마다 호출될 함수를 설정합니다.setState
를 사용하여 위젯을 새 데이터로 다시 빌드하는 것을 트리거합니다.setState
내에서 _username = _usernameController.text;
는 텍스트 필드의 현재 텍스트로 _username
변수를 업데이트합니다.TextEditingController
는 텍스트 필드의 변경 사항을 감지하여 _username
상태 변수를 그에 따라 업데이트합니다._username
변수가 이 입력을 반영하도록 업데이트되며, 위젯은 이 변경 사항을 반영하도록 다시 빌드됩니다. 이 메커니즘은 위젯의 상태가 항상 텍스트 필드의 현재 값을 포함하도록 보장합니다.TextField(controller: _usernameController, ...)
: 이 TextField
는 사용자로부터 사용자 이름을 입력받는 데 사용됩니다.
_usernameController
: 이는 TextEditingController
의 인스턴스로, 사용자가 TextField
에 입력하는 텍스트를 관리합니다. 사용자가 입력한 텍스트는 이 컨트롤러를 통해 _username
변수에 동기화됩니다.
decoration: InputDecoration(...): 텍스트 필드의 외관을 꾸미는 데 사용됩니다.
hintText: "Username": 사용자에게 입력 필드의 목적을 알려주는 힌트 텍스트입니다.
enabledBorder와 focusedBorder: 텍스트 필드의 테두리 스타일을 정의합니다. 여기서는 사용 가능하고 포커스된 상태일 때 모두 동일한 회색 테두리를 사용합니다.
이 코드 조각은 Flutter에서 AnimatedContainer
위젯을 사용하여 동적인 UI를 생성하는 방법을 보여줍니다. 구체적으로, 사용자가 텍스트 필드에 입력하는 내용에 따라 AnimatedContainer
의 색상이 변경되는 방식을 사용합니다. 세부 내용을 살펴보겠습니다:
color: _username.isEmpty ? Colors.grey.shade300 : Theme.of(context).primaryColor
: 컨테이너의 배경색을 결정합니다. 사용자 이름이 비어 있으면 회색으로, 아니면 앱의 기본 색상으로 설정됩니다. enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey.shade400,
),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey.shade400,
),
),
이 코드 조각은 Flutter에서 TextField
위젯의 decoration
속성 내에 있는 enabledBorder
와 focusedBorder
를 사용하여 텍스트 필드의 테두리 스타일을 정의하는 방법을 보여줍니다.
enabledBorder: UnderlineInputBorder(...)
: 텍스트 필드가 활성화되었지만 포커스되지 않았을 때의 테두리 스타일을 정의합니다.
UnderlineInputBorder
: 텍스트 필드의 밑줄 형태의 테두리를 생성합니다.
borderSide: BorderSide(color: Colors.grey.shade400, ...)
: 테두리의 색상과 스타일을 정의합니다. 여기서는 회색 계열의 색상을 사용하고 있습니다.
focusedBorder: UnderlineInputBorder(...)
: 텍스트 필드가 포커스되었을 때의 테두리 스타일을 정의합니다.
이 역시 UnderlineInputBorder
를 사용하여 밑줄 형태의 테두리를 지정합니다.
focusedBorder
의 borderSide
도 enabledBorder
와 동일한 색상을 사용합니다. 이는 텍스트 필드가 포커스를 받더라도 테두리 색상이 변경되지 않음을 의미합니다.
이 설정은 텍스트 필드가 활성화 상태이든 포커스 상태이든 관계없이 일관된 테두리 스타일을 유지하도록 합니다. 사용자가 필드를 선택하거나 입력을 시작할 때 테두리의 시각적 변화를 최소화하려는 디자인 선택일 수 있습니다. 일반적으로, focusedBorder
를 사용하여 사용자가 텍스트 필드를 선택했을 때 시각적인 피드백을 제공하는 것이 일반적입니다. 그러나 이 경우에는 테두리 스타일을 동일하게 유지하여 UI의 단순함과 일관성을 강조합니다.
AnimatedContainer
는 _username
변수의 내용에 따라 색상이 변경됩니다. AnimatedContainer
의 duration
속성에 의해 부드럽게 전환됩니다.이 코드는 사용자의 입력에 따라 인터페이스 요소의 시각적 피드백을 제공하는 좋은 예시입니다. 사용자가 입력을 하는 동안 UI가 동적으로 반응하여 사용자 경험을 향상시킵니다.
이 코드에서 TextField
와 TextEditingController
는 사용자 이름 입력을 받아서 처리하고, 사용자가 입력을 마치면 'Next' 버튼의 상태를 업데이트합니다. 사용자가 텍스트를 입력하면, AnimatedContainer
의 색상이 변경되어 사용자가 'Next' 단계로 넘어갈 준비가 되었음을 시각적으로 나타냅니다. 이러한 방식으로, 사용자 인터페이스는 동적이고 상호작용적인 경험을 제공합니다.
TextField(
controller: _emailController,
keyboardType: TextInputType.emailAddress,
onEditingComplete: _onSubmit,
decoration: InputDecoration(
hintText: "Email",
errorText: _isEmailValid(),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey.shade400,
),
),
),
)
이 코드 조각은 Flutter 애플리케이션의 일부로, 이메일 입력을 처리하기 위한 TextField
위젯을 설정하는 부분입니다. 각 기능을 자세히 살펴보겠습니다:
controller: _emailController
는 _emailController
라는 TextEditingController
를 사용합니다. 이 컨트롤러는 필드에 입력된 텍스트를 관리합니다.keyboardType: TextInputType.emailAddress
는 이메일 입력에 최적화된 키보드 타입을 설정합니다. 이는 보통 '@' 기호와 '.com' 버튼을 포함합니다.onEditingComplete: _onSubmit
은 사용자가 텍스트 편집을 마칠 때 호출될 함수를 지정합니다(예: 키보드의 '완료' 버튼을 누를 때). _onSubmit
은 다른 곳에서 정의된 함수로, 사용자가 이메일 입력을 마친 후 처리할 작업을 다룹니다.hintText: "Email"
은 필드가 비어 있을 때 그 안에 회색으로 표시되는 텍스트를 제공하여 사용자에게 무엇을 입력해야 하는지 안내합니다.errorText: _isEmailValid()
는 입력된 이메일이 유효하지 않을 경우 에러 텍스트를 표시합니다. _isEmailValid()
함수(아마도 코드의 다른 부분에서 정의됨)는 이메일이 유효하지 않을 경우 에러 메시지를 반환하고, 유효하면 null
을 반환합니다(errorText
에 null
을 표시하면 에러 메시지가 표시되지 않습니다).enabledBorder: UnderlineInputBorder(...)
는 텍스트 필드가 활성화되었지만 포커스되지 않았을 때의 테두리를 정의합니다. 여기서는 회색의 밑줄 테두리입니다. Colors.grey.shade400
으로 설정된 borderSide는 이 밑줄 테두리의 색상과 스타일을 설정합니다.이 TextField
는 이메일 입력에 맞게 조정되어 있으며, 특정한 키보드 타입, 편집이 완료되었을 때 수행할 동작, 힌트 텍스트 및 이메일의 유효성에 따라 변화하는 동적 에러 처리를 포함한 맞춤형 외관을 가지고 있습니다. TextEditingController
는 프로그래밍 방식으로 텍스트 필드의 내용을 읽거나 변경할 수 있게 해줍니다.