24년 6월을 기준으로 작성되었습니다.
1. ext.kotlin_version 에러 (안드로이드에서만 발생)
플러터 버전 혹은 플러터에서 사용하는 버전과 Kotlin 버전이 호환되지 않을 때, 흔히 아래와 같은 에러를 볼 수 있다.
에러를 해결하기 위해서는, 프로젝트의 android/build.gradle (프로젝트 gradle 파일)에서 ext.kotlin_version이 적혀 있는 코드를 최신 버전으로 업데이트 해주면 된다.
※ Kotlin 버전 정보
https://kotlinlang.org/docs/releases.html#release-details
2. Multidex error (안드로이드에서만 발생)
안드로이드에서 앱 개발을 하다 코드가 많아지고 라이브러리도 늘어나면서
-> 한 프로젝트에서 약 64,000개 이상의 앱을 정의했다면, Multidex를 활성화해줘야 한다.
3. Android SDK 버전 에러
플러터 외부 패키지를 추가하다 보면, 안드로이드 최소 버전에 제한이 있는 경우가 있다.
4. FVM으로 Flutter SDK 설치시 발생할 수 있는 에러
여기서 "Git 찾기 불가" 에러는 추가로 Powershell 관리자 모드에서 아래 명령어를 실행했다.
git config --global --add safe.directory '*'
5. [Flutter 설치 오류] - Error : ADB exited with exit code 1 Performing Streamed Install
그리고 에러 메시지에는 다음과 같이 나올 것이다.
'INSTALL_FAILED_INSUFFICIENT_STORAGE' -> 설치 실패 스토리지(용량) 부족
따라서 내 앱을 실행할 AVD의 스토리지(데이터)를 "Wipe Data" 로 정리해주면 된다.
6. velocity_x 사용 중 발생하는 에러
1. LayoutBuilder does not support returning intrinsic dimensions.
아래와 같은 에러가 발생할 때가 있다.
======== Exception caught by rendering library =====
The following assertion was thrown during performLayout():
LayoutBuilder does not support returning intrinsic dimensions.
Calculating the intrinsic dimensions would require running the layout callback speculatively, which might mutate the live render object tree.
아래와 같은 코드를 작성할 때 발생했던 에러였다.
import 'package:velocity_x/velocity_x.dart';
PopupMenuButton(
itemBuilder: (context) {
/// 제품 리뷰 다이얼로그
return [
PopupMenuItem(
child: "리뷰 등록".text.make(),
onTap: () {},
),
];
},
),
처음에는 레이아웃 크기를 지정해주지 않아서 발생하는 에러인 줄 알았으나 (onTap에 showDialog()를 구현했었음)
알고보니 builder 함수에 velocity_x를 사용한 text 위젯이 들어가 있어서 발생했던 문제였다.
따라서 velocity_x를 사용하지 않고 -> builder 함수 내부에서는 일반적인 플러터 위젯을 사용해야 한다.
정확한 이유는 모르겠지만, 아마 velocity_x로 만드는 위젯은 lazy하니까, 당장 builder 함수에서 사용할 수 없기 때문에 에러가 발생했던 것 같다.
velocity_x를 사용하던 강의에서 아마 이런 위험사항을 알려줬을 텐데, 대충대충 듣다보니 이런 문제를 쉽게 해결하지 못했던 것 같다 ㅠㅠ
7. "flutterfire configure" 로 프로젝트에 플러터파이어를 설정할 때 발생하는 에러
한창 설치 중 이런 메시지가 뜰때가 있다.
말 그대로 안드로이드 설정 중에 패키지 이름이 비어있다는 것이 문제 사항이었고,
파란색 글씨처럼 명령어를 작성해도 되고, AndroidManifest.xml 에 패키지 이름을 추가해주면 되기도 한다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.your.orgname.my_app_name"> // 여기에 추가
<application
android:label="com.your.orgname.my_app_name"
https://qiita.com/asarashi/items/90a5af762e1ee626837f
8. 개발 환경 구축 시 'Android toolchain' 에 발생할 수 있는 2가지 문제
1) 'cmdline-tools component is missing' 문제 해결하기
2) 'Android license status unknown' 문제 해결하기
9. 앱 실행 도중 Error:Execution failed for task ':app:compileDebugKotlin' 가 발생할 때
1) Error: Unknown Kotlin JVM target: 21(다른 숫자가 될 수도 있음)
프로젝트 Android 폴더 -> app 폴더 -> app 폴더 내부의 build.gradle 파일을 다음과 같이 추가하거나, 수정한다.
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
}
나 같은 경우는 kotlinOptions를 추가해야 해서, 기존 compileOptions에 맞게 java 8로 추가해줬다.
10. Vertical viewport was given unbounded height 에러
ListView 위젯이나 SingleChildScrollView 위젯들을 사용하다 보면 흔히 접하게 되는 이슈이다.
기본적인 원인은 스크롤 가능한 위젯 내부에 또 한번 스크롤 가능한 위젯(높이가 정해지지 않은)을 넣게 되면 발생한다.
-> 따라서 내부 위젯의 크기(여기서는 높이)를 다양한 방법으로 지정해야 한다!
======== Exception caught by rendering library ==================
The following assertion was thrown during performResize():
Vertical viewport was given unbounded height.
Viewports expand in the scrolling direction to fill their container.
In this case, a vertical viewport was given an unlimited amount of vertical space in which to expand.
This situation typically happens when a scrollable widget is nested inside another scrollable widget.
If this widget is always nested in a scrollable widget there is no need to use a viewport because there will always be enough vertical space for the children.
In this case, consider using a Column instead.
Otherwise, consider using the "shrinkWrap" property (or a ShrinkWrappingViewport) to size the height of the viewport to the sum of the heights of its children.
1) shrinkWrap 옵션 사용
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListView(
shrinkWrap: true, // 추가
children: [
Container(color: Colors.amber, height: 200,),
Container(color: Colors.cyan, height: 400,),
Container(color: Colors.orange, height: 200,),
],
)
],
);
}
2) 부모 영역 지정
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox( // 부모 영역 지정
height: MediaQuery.of(context).size.height,
child: ListView(
children: [
Container(color: Colors.amber, height: 200,),
Container(color: Colors.cyan, height: 400,),
Container(color: Colors.orange, height: 200,),
],
),
)
],
);
}
3) Expanded 위젯 사용
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded( // Expanded 위젯 사용
child: ListView(
children: [
Container(color: Colors.amber, height: 200,),
Container(color: Colors.cyan, height: 400,),
Container(color: Colors.orange, height: 200,),
],
),
)
],
);
}
'Dart와 Flutter' 카테고리의 다른 글
Flutter 소소한 팁 (0) | 2024.11.27 |
---|---|
강의 내용 정리 - [Flutter로 메신저 앱 만들기] (0) | 2024.10.28 |
Provider와 Riverpod (2) | 2024.10.11 |
강의 내용 정리 - [Flutter로 SNS 앱 만들기] (0) | 2024.05.03 |