[Do it! 플러터]

Heeyoung Joe·2023년 11월 4일
0

Flutter

목록 보기
4/7

구조 이야기도 해야겠지만...

집중력이 훅 떨어져서 오류 잡기 급급하군요.

다음에 stateless vs stateful 앱의 구조 차이를 알아보고 오늘은 에러를 잡아보겠습니다.

import 'package:flutter/material.dart';
void main() async {
  runApp(MainApp());
}

class MainApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page');
    );
  }
}

책에서 제시된 코드인데 책에서는 실행하자마자 바로 화면이 뜰 것이라고 하지만, 저는 아래와 같은 문법 에러가 납니다.

The method 'MyHomePage' isn't defined for the type 'MainApp'.
Try correcting the name to the name of an existing method, or defining a method named 'MyHomePage'.

진짜 진짜 집중 안 되는데... 책에는 지금 따로 없네요. 몇 챕터 뒤에나 나오는데... "코드에서는 home에 MyHomePage 클래스를 지정했습니다"라고만 적혀있어요...

알고 보니까 따로 소스코드가 개제되어있었네요.

하지만 문법 에러 있습니다.

아래가 바꿔놓은 코드입니다.
그새 변수에 대한 optional 여부 설정이 많이 중요해졌나봐요. MyHomePage 클래스의 생성자에 적힌 key와 title에 null 들어오면 안된다고 문법 에러가 떠서 Key 데이터형 뒤에 ?, 그리고 this.title이 처음 정의되는 위치인 final String 뒤에 ?를 붙여놨습니다. 근데 key는 반드시 필요하긴 할텐데... 이게 변수 선언이 아니라 parameter를 받아오는 거라 late으로 설정할 수가 없는 것 같아요.

import 'package:flutter/material.dart';
void main() async {
  runApp(MainApp());
}

class MainApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page');
    );
  }
}


class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}


class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
          ],
        ),
     
      )
    );
  }
}

이랬더니 문제... widget.title에서 문법에러가 납니다. 얘는 또 nullable한 건 참조할 수 없다고 난리네요.

와우
widget.title!이라고 뒤에 느낌표 붙여주니까 끝남
이거 보고 앎
https://velog.io/@terman/Error-The-argument-type-String-cant-be-assigned-to-the-parameter-type-String-because-String-is-nullable-and-String-isnt.return-facebookauthprovider.credentialresult.accesstoken
!는 null check operator 역할을 한답니다.

궁금해서 ? 지워도 되나 해볼게요

--> 아무데나 붙인다고 되는 것 같진 않고 함수를 호출 할 때 nullable로 정의된 매개변수에 값을 넣으면서만 쓸 수 있는 것 같아요...

profile
SW Engineer

0개의 댓글