작성
·
1.5K
1
final homeUrl = Uri.parse('https://blog.codefatory.ai');
homeUrl을 해당 변수를 사용하는 클래스 밖(상위)에서 선언하는건 어떤이유인가요?
loadRequest()가 수행되는공간과 같은 공간에 위치시켰더니
'the instance member 'homeUrl' can't be accessed in an initializer. Try replacing the reference to the instance member with a different expression.' 이란 에러가 뜨더군요.
클래스 컨스트럭터 내에서 변수를 사용하려면 상위공간에 미리 선언해야만 하는것인가요?
(이전 코드에선 web view위젯 안에서 homeUrl을 call했기에 webview위젯 밖에 선언되어있어서 괜찮았던거라고 이해해도되는걸까요?
WebViewController controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadRequest(homeUrl);
새로 등장한 이 코드에서 (..)은 찾아보니 cascade notation 이라는 문법이더군요.
맞다면
WebViewController controller = WebViewController();
controller.setJavaScriptMode(JavaScriptMode.unrestricted);
controller.loadRequest(homeUrl);
과 같은 뜻일텐데 이 코드처럼 풀어서 쓰려하면' the name of a constructor must match the name of the enclosing class'라는 에러가 뜹니다. 이는 왜일까요?
답변 1
0
안녕하세요!
1번의 경우 클래스 인스턴스의 프로퍼티 (변수)에서 또다른 클래스 인스턴스의 프로퍼티를 접근 할 수 없기때문입니다.
추가로, homeUrl의 경우 경로가 변경될 일이 없기때문에 어디에 선언해도 상관이 없습니다.
2번의 경우 이해하신게 맞습니다. 혹시 WebViewController controller = WebViewController()를 선언하시고 바로 아래에 함수들을 실행하셨나요? 그건 불가능한 방식입니다. 특정 함수를 실행하는 위치는 클래스의 함수 안에서만 가능합니다. 외부에서는 변수 선언만 가능합니다. cascade operator의 경우 결국 타겟 변수를 반환해주기때문에 가능한 문법입니다.
WebView 강의의 경우 낮은 난이도로 앱을 구현해보는데 초점을 두고 설계되었습니다. 이전 버전의 WebView 플러그인에서는 이 목적에 잘 맞았는데 플러그인 버전업이 되다보니 난이도를 최대한 높히지 않고 강의를 진행하려다보니 코드가 약간 어색한 부분이 있을 수 있습니다. 예를들어 WebView를 조금 더 효율적으로 사용하려면 최소한 StatefulWidget과 라이프사이클을 배워야합니다. 강의를 조금 더 진행해보시고 라이프사이클까지 봐보시면 의문점들이 모두 풀리실거라 생각합니다.
감사합니다!
클래스 인스턴스의 프로퍼티 라는부분이 잘 이해가되지않아 추가 질문드립니다.
homescreen이라는 클래스가 있다면 homescreen 내부에서 정의 하는 프로퍼티(변수)는 그냥 클래스 내부의 프로퍼티라고 해야하지않나요? homescreen의 인스턴스를 생성해서
var homescreenInstance = homescreen();
homescreenlnstance.length;
이런식으로 사용할때 위의 length부분이 homescreen클래스의 인스턴스의 프로퍼티가 아닌가요?
아님 혹시 클래스의 인스턴스 프로퍼티 (static property가 아닌)를 말씀하신걸까요?
네 제가 말을 좀 헷갈리게 한 것 같네요. static이 아닌걸 지칭했습니다. 일반적으로 클래스의 프로퍼티라고 하지만 혹시 static으로 선언하면 되지 않냐고 하실까봐 '인스턴스'라는 명칭을 넣게 되었네요! 이해하신게 맞습니다.
친절한 답변 감사드립니다.