1. Flutter 심화
상태관리 생명주기
createState() statefulWidget에 반드시 존재해야 함
initState() 위젯이 생성될 때 호출되는 메서드, state를 초기화해주는 역할, 최초 한번만 호출
didChageDependencies() 위젯이 최초 생성된 후, initState() 다음에 바로 호출된다. 위젯이 의존하는 데이터의 객체가 변경될때마다 호출됨.
build UI구현하는 부분, 가장 많이 호출됨. 반드시 존재해야 override대상, 반드시 widget을 반환해야 함.
setState() 내부 상태가 변경되었다는 것을 프레임워크에 알려주고, build() 호출. 사용하지 않으면 UI에 변경 데이터가 반영되지 않음.
didUpdateWidget() 위젯의 구성이 변경될 때마다 호출됨, 부모 위젯이 변경되어 재구성해야 하는 경우 호출. 이전 상태의 자신을 받는다( oldWidget)
dispose() 사용되었던 것을 영구적으로 제거할 때 사용. 제거하지 않으면 메모리 누수발생, 앱 성능 떨어짐.
예시) 글자가 서서히 나타나는 위젯 전체코드
import 'dart:math';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int randomNumber = 0;
void generateRandomNumber() {
setState(() {
randomNumber = Random().nextInt(1000);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
floatingActionButton:
FloatingActionButton(onPressed: generateRandomNumber),
body: Center(
child: FadeInText(
text: '$randomNumber',
),
),
);
}
}
class FadeInText extends StatefulWidget {
const FadeInText({super.key, required this.text});
final String text;
@override
State<FadeInText> createState() => _FadeInTextState();
}
class _FadeInTextState extends State<FadeInText> with TickerProviderStateMixin {
late final AnimationController controller =
AnimationController(vsync: this, duration: Duration(seconds: 1));
late final Animation animation =
Tween<double>(begin: 0, end: 1).animate(controller);
@override
void initState() {
super.initState();
controller.forward();
}
// *********************************************************didUpdateWidget
@override
void didUpdateWidget(covariant FadeInText oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.text != widget.text) {
controller.reset();
controller.forward();
}
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: animation,
builder: (context, child) {
return Opacity(
opacity: animation.value,
child: Text(
widget.text,
style: const TextStyle(fontSize: 20),
),
);
},
);
}
}
앱 아이콘 변경
안드로이드 android/app/src/main/AndroidManifest.xml
앱 삭제 후 재설치 권장
iOS iOS/Runner/Info.plist
flutter_launcher_icons 패키지 사용
flutter pub add -d flutter_launcher_icons 로 패키지 추가
flutter_launcher_icons.yaml 만들기
flutter_launcher_icons:
android: true
ios: true
image_path: "assets/app_icon.png"
패키지명 바꾸기
애플리케이션 고유 식별자
Android, iOS 플랫폼에서 앱을 구분하기 위해 사용
플레이스토어, 앱스토어에서 이 패키지명으로 앱을 구분지음
도메인 이름을 뒤집어 작성 후 앱 이름 써줌
원래 iOS, Android 각각 네이티브 폴더 아래 파일들 직접 수정해주어야함change_app_package_name 패키지 이용
패키지 설치 : flutter pub add -d change_app_package_name
vscode 터미널에서 패키지 실행
dart run change_app_package_name:main 바꿀패키지명
dart run change_app_package_name:main com.abcde.chatbot
2. 인사이트 클럽
https://www.youtube.com/watch?v=MLjFjtVJqVc
서비스와 제품은 상향평준화 될 것이며, 결국 고객의 선택을 받는 것은 UX에서 결정된다는 의견에 동의했다.
수많은 브랜드들이 있지만 소비자들의 선택을 받는 것은 결국 고객경험 설계가 잘 이루어진 제품이었다.
온라인, 오프라인 경험 모두 포함해서 특별한 경험과 가치를 제공했을 경우에 충성고객을 심을 수 있었다.
예를 들면, 탬버린즈 같은 경우 현대미술에 가까운 아트웍으로 신선한 경험을 제공했고,
패키징과 향 또한 기존에 익숙한 제품들과 다른 독특한 디자인으로
그들의 주 고객인 20대의 트렌디한 사람들의 관심과 소비를 이끌어왔다.
자본력도 무시할 수는 없지만, 샤넬, 디올과 같은 브랜드에서도 팝업스토어, 전시, 프라이빗 세션 등
꾸준히 고객경험을 개선하기 위한 작업이 이루어져 왔다는 것이다.
자본이 부족하다면 그보다 디테일하고 확실한 UX설계,
정말로 마음으로 공감할 수 있는 UX 설계가 필요할 것이라는 생각이 들었다.
그리고 UX 설계를 잘 하기 위해서는 그만큼 고객분석이 잘 되어있어야 할텐데,
마음 한켠에 수익성에 대한 확신이 부족해서 그런지 쉽지가 않다.
아예 몰입하던지, 아니면 몰입할 수 있는 주제로 넘어가야 하는 것인지.
창업이라는 게 처음이라서 그런것인지, 다음 스텝을 어떻게 밟아나가야 할 지 막연하다.
명확한 기준과 프로세스가 없기 때문이라는 조언을 듣긴 했는데,
기준과 프로세스를 어떻게 설정해야 하는지에 대해서 감이 없다.
일단 방법론과 경험담을 찾아봐야겠다.
댓글
댓글 쓰기