TextField 위젯은 username을 입력받아 처리할 수 있다. 이 스크린에서는 username을 입력받아 _username
에 저장할 것이다. 그러기 위해선 우선 TextField를 먼저 만든다. 그리고 cursorColor, hintText를 설정해 디자인을 수정할 수도 있다.
TextField(
cursorColor: Theme.of(context).primaryColor,
decoration: InputDecoration(
hintText: 'Username',
),
),
입력되는 값을 처리하기 위해서 _usernameController
를 만든다. 또한 입력되는 username을 저장할 변수 _username
을 만든다.
final TextEditingController _usernameControl = TextEditingController();
String _username = '';
해당 controller가 TextFiel에 연결되도록 TextField의 controller를 _usernameController
로 설정한다.
TextField(
controller: _usernameControl,
// ...
addListner를 설정해 TextField의 값이 _username
에 저장되도록 설정한다.
@override
void initState() {
super.initState();
_usernameControl.addListener(() {
_username = _usernameControl.text;
});
}
그러면 TextField에 사용자가 입력한 텍스트가 자동으로 _username
에 저장된다.
https://github.com/soaringwave/tiktokclone/commit/731f419d9187ef573fbd94588f552f1713bde516
❗️사용하지 않을 땐 _usernameController
를 dispose해야 앱 붕괴를 막을 수 있다.
https://github.com/soaringwave/tiktokclone/commit/9b30ea15f87928838d42ffae834772ea747db256
이 버튼의 경우 사용자가 값을 입력하면 버튼의 배경색과 글자색이 회색에서 분홍색과 흰색으로 변한다. _username
의 isNotEmpty 값에 따라 AnimatedContainer의 배경색을 달리 지정한다. 그리고 애니메이션이 진행될 시간을 Duratioin을 통해 지정한다.
FractionallySizedBox(
widthFactor: 1,
child: AnimatedContainer(
duration: const Duration(
milliseconds: 500,
),
alignment: Alignment.center,
decoration: BoxDecoration(
color: _username.isNotEmpty
? Theme.of(context).primaryColor
: Colors.grey.shade300,
),
// ...
그리고 child를 (Padding으로 감싼)AnimatedDefaultTextStyle로 구현하고 마찬가지로 duration과 색을 지정하면 된다.
child: AnimatedDefaultTextStyle(
duration: const Duration(
milliseconds: 500,
),
style: TextStyle(
color: _username.isNotEmpty
? Colors.white
: Theme.of(context).hintColor,
fontSize: Sizes.size20,
fontWeight: FontWeight.w600,
),
child: const Text(
'Next',
),
),
// ...
AnimatedContainer class 공식 문서
https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html
https://github.com/soaringwave/tiktokclone/commit/24f0c1602ab6d6e8eb038fd946c66ff2c2bfdf53
https://github.com/soaringwave/tiktokclone/commit/184ab5e58be92377b99207969728efdd0cf3c5df