본문으로 바로가기
loading
반응형

1. 코딩 노란밑줄 제거, 애뮬레이터 초기화 방법

코딩에 노란색 줄이 잔뜩하다. 그리고 어플은 실행되지도 않는다.

노란색 줄 가득한 코드(플루터)
실행되지 않는 콘솔

 


오늘은 어떻게든 텍스트 위젯을 마스터해야겠다. 빨간색 오류는 없는걸 보아서 아래 오류부터 해결해야 할 것 같다. 오류해결에는 구글링이 역시 최고인 듯하다.

√  Built build\app\outputs\flutter-apk\app-debug.apk.

빌드가 설치가 되지 않았다라는 그런 이야기 같은데, 실제 해결책을 보니 애뮬레이터 관리자로 들어가 wipe data를 선택하여 애뮬레이터를 리셋시키는 것이 방법인 듯하다.(애뮬레이터 초기화)

 

애뮬레이터 초기화 이후, 드디어 나의 코딩 결과물이 나왔다.

플루터 애뮬레이터 실행화면

하지만 문제는 코딩에 노란줄이다. 노란줄은 왜 실행되는 것일까? 쳇봇을 통해 다시한 번 파고들기 시작했다. 우선 코딩에 노란밑줄이 생기는 경우는 분명 문제가 있음을 나타내는 것이다. 완벽하지 않다는 것이다. 이에 노란줄 위에 마우스를 올리고 있으면 해당 오류가 보이고 해결법도 보인다.

플로터 코딩에 노란줄이 떳을 때
노란줄 해결 완료.

const 함수는 무엇일까? 머티리얼 위젯을 불러오는 코드앞에 const만 입력했을 뿐인데 아래 노란줄이 모두 사라졌다.

return const MaterialApp( // 머티리얼 위젯

 const 함수란,

플러터(Flutter)에서 const 키워드는 상수(constant)를 선언할 때 사용됩니다. 상수는 값이 변하지 않는 변수로, 한 번 할당되면 수정할 수 없습니다. const를 사용하여 선언된 변수는 컴파일 타임에 값이 결정되며, 실행 중에 변경할 수 없습니다.

const 함수는 특정 작업을 수행하고 결과를 반환하는 함수를 선언할 때 사용될 수 있습니다. 이렇게 선언된 함수는 항상 동일한 입력에 대해 동일한 결과를 반환하며, 함수 내에서 상태를 변경하지 않습니다.

예를 들어, 다음은 const 함수를 사용하여 두 개의 정수를 더하는 예제입니다:

dart
int addNumbers(int a, int b) {
  return a + b;
}

void main() {
  const result = addNumbers(1, 2);
  print(result); // 출력: 3
}

위의 예제에서 addNumbers 함수는 const 함수로 선언되지 않았지만, const result를 통해 컴파일 타임 상수로 선언되었습니다. 따라서 result는 실행 중에 변경할 수 없는 상수가 됩니다.

const 함수를 사용하여 실행 중에 변경되지 않는 값을 반환하거나, 컴파일 타임 상수로 활용할 수 있습니다.

그래도 모르겠다. 일단 이런 함수가 있다는 걸 이해하고 참고하도록 해야겠다.

반응형

2. 제스처 관련 위젯 연습(버튼 위젯)

제스처란, 사용자가 키보드로 글자를 입력하는 행위 외의 모든 입력을 제스처라고 부른다. 화면을 한번 터치한다거나, 두번 탭한다거나, 길게 누르는 행동 모두가 제스처라고 한다. 아래와 같이 버튼 위젯을 테스트한다.

또 온갖 오류의 향연이다. 우선 textbutton에 대한 오류가 시작되었다. 아무리봐도 개발환경에 문제가 많은 것 같다. 필요한 위젯들이 제대로 설치되지 않은 듯한 느낌과, 경로에 대한 오류가 느껴지는 것은 무엇일까?

텍스트 버튼 위젯 코딩에 대한 오류 화면

 

우선 해당 코딩에서 텍스트 버튼만 정의하고, 버튼안의 글자가 어떻게 들어갈 것인지에 대한 코딩이 조금 부족해서 텍스트 를 추가해줘서 TextButton위젯의 오류는 해결하였지만, onPressed라는 오류는 해결하지 못하고 있다.

onPressed: () {}는 버튼이 눌렸을 때 실행할 동작을 정의하는 코드입니다. 이 코드는 플러터(Flutter)에서 버튼 위젯을 사용할 때 주로 활용됩니다.

onPressed는 콜백 함수를 받는 매개변수로, 버튼이 눌렸을 때 실행될 함수를 지정합니다. 함수의 형태는 void Function()이며, () {}는 빈 함수를 의미합니다. 여기에 원하는 동작을 구현하면 됩니다.

예를 들어, 다음은 버튼을 눌렀을 때 콘솔에 메시지를 출력하는 코드입니다:

dart
ElevatedButton(
  onPressed: () {
    print("버튼이 눌렸습니다!");
  },
  child: Text("버튼"),
),

위의 예제에서 onPressed에 지정된 함수는 버튼이 눌렸을 때 "버튼이 눌렸습니다!"라는 메시지를 콘솔에 출력합니다. 버튼이 눌렸을 때 실행할 동작을 여기에 구현하면 됩니다.

onPressed는 플러터에서 버튼 위젯을 사용할 때 주로 활용되며, 버튼이 눌렀을 때 실행될 함수를 지정한다. 하지만 아무리 해도 onPressed함수가 오류가 난다.

import 'package:flutter/material.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const MaterialApp( // 머티리얼 위젯
home: Scaffold( // 스코프 위젯
body: Center(
child: TextButton(
//클릭 시 실행
onPressed: () {
// 비튼 클릭 시 실행할 동작 구현
},
// 스타일 지정
style: TextButton.styleFrom(
// 주 색상 지정
foregroundColor: Colors.red,
),
//버튼에 넣을 위젯
child: Text("텍스트 버튼"),
),
),
),
);
}
}

에러 내용은 아래와 같다.

lib/main.dart:15:26: Error: Not a constant expression.
              onPressed: () {
                         ^^

15:26: Error: Not a constant expression. 에러는 onPressed 속성에 상수 표현식이 아닌 코드가 사용되었을 때 발생하는 오류입니다.

플러터(Flutter)에서 onPressed 속성은 버튼이 클릭되었을 때 실행될 동작을 지정하는 속성으로, 상수 표현식이어야 합니다. 하지만 () {}는 함수 리터럴로서 상수 표현식이 아닙니다.

해결 방법은 다음과 같습니다:

  1. 버튼 클릭 시 실행할 함수를 정의하고, 해당 함수의 이름을 onPressed에 지정합니다. 예를 들어:
dart
void handleButtonPress() {
  // 버튼 클릭 시 실행할 동작 구현
}

ElevatedButton(
  onPressed: handleButtonPress,
  child: Text("버튼"),
)
  1. 익명 함수(anonymous function)를 사용하여 onPressed에 직접 함수를 정의합니다. 예를 들어:
dart
ElevatedButton(
  onPressed: () {
    // 버튼 클릭 시 실행할 동작 구현
  },
  child: Text("버튼"),
)

위의 예제에서는 handleButtonPress 함수를 만들거나, 익명 함수를 사용하여 onPressed에 함수를 정의하여 오류를 해결할 수 있습니다.

상수 표현식이 아닌 코드가 사용되었을 때 발생하는 오류입니다. 플러터에서 onPressed속성은 버튼이 클릭되었을 때 실행될 동작을 지정하는 속성으로, 상수 표현식이어야 합니다. 하지만 () {}은 함수 리터럴로서 상수표현식이 아닙니다.

상수? 리터럴?

상수(Constant)와 리터럴(Literal)은 플러터(Flutter) 및 다른 프로그래밍 언어에서 자주 사용되는 개념입니다.

  • 상수(Constant): 프로그램 실행 중에 값이 변하지 않는 변수를 의미합니다. 한 번 값이 할당되면 변경할 수 없습니다. 상수는 final 또는 const 키워드를 사용하여 선언됩니다. final 상수는 런타임에 값을 할당할 수 있으며, const 상수는 컴파일 타임에 값을 할당해야 합니다.

예시:

dart
final int x = 10; // final 상수
const double pi = 3.14; // const 상수
  • 리터럴(Literal): 소스 코드에서 직접 나타나는 값 자체를 의미합니다. 리터럴은 상수가 될 수도 있고, 변수에 할당되거나 다른 표현식에 사용될 수도 있습니다. 리터럴은 데이터의 고정된 값을 나타냅니다.

예시:

dart
int age = 25; // 리터럴 25
String name = 'John'; // 리터럴 'John'
bool isTrue = true; // 리터럴 true

위의 예시에서 x, pi, age, name, isTrue는 모두 상수 또는 리터럴입니다. x와 pi는 상수로 선언되었고, age, name, isTrue는 변수에 할당된 리터럴 값입니다.

상수와 리터럴은 프로그래밍에서 값을 표현하고 사용하는 중요한 개념입니다. 이해를 돕기 위해 코드 예시를 제공하였으며, 플러터에서도 동일한 개념을 사용합니다.

상수와 리터럴은 아주 중요한 개념이다. 책에서 배운 것 처럼 다트언어에 대한 기본 개념이 있어야 한다. final과 const에 대한 이해를 명확히 하고 에러를 해결해봐야겠다.

위 상황을 종합했을 때, 

onPressed는 상수 표현식으로 나타내어야 한다고 했다. 그럼 상수에 대한 선언을 해주면 에러가 해결되는 것인가?

위와 같이 Final로 리터럴 값으로 선언을 해주었지만, 아래 onPressed에서 오류가 나고 있다. 오늘 공부는 여기까지, 시간날 때 틈틈히 해당 오류에 대한 이해를 해보도록 해야겠다.

 

반응형