커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
전체화면 광고 에러
[왕초보] 플러터(Flutter)로 시작하는 앱개발 종합반 v0
5주차
북마크
김*섭
댓글
8
추천
0
조회수
12
조회수
12
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.


숙제중 전면광고에 대해 'ad ' 에 대해 정의가 안되었다고 나옵니다.


스파르타 즉문즉답




작성한 코드 및 에러 메세지

에러 메시지는 다음과 같습니다.

lib/main.dart:88:28: Error: The getter 'ad' isn't defined for the class '_HomePageState'.

- '_HomePageState' is from 'package:mymemo_admob/main.dart' ('lib/main.dart').

Try correcting the name to the name of an existing getter, or defining a getter or field named 'ad'.

interstitialAd = ad;

^^


main.dart

// ignore_for_file: must_be_immutable, non_constant_identifier_names


import 'dart:io';


import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';

import 'package:google_mobile_ads/google_mobile_ads.dart';

import 'package:provider/provider.dart';

import 'package:shared_preferences/shared_preferences.dart';


import 'memo_service.dart';


late SharedPreferences prefs;


void main() async {

WidgetsFlutterBinding.ensureInitialized();

prefs = await SharedPreferences.getInstance();

MobileAds.instance.initialize();


runApp(

MultiProvider(

providers: [

ChangeNotifierProvider(create: (context=> MemoService()),

],

child: const MyApp(),

),

);

}


class MyApp extends StatelessWidget {

const MyApp({super.key});


@override

Widget build(BuildContext context) {

return MaterialApp(

debugShowCheckedModeBanner: false,

home: HomePage(),

);

}

}


// 홈 페이지

class HomePage extends StatefulWidget {

const HomePage({super.key});


@override

State<HomePagecreateState() => _HomePageState();

}


class _HomePageState extends State<HomePage> {

final BannerAd myBanner = BannerAd(

// Test 광고 ID, 광고 승인받은 후 생성한 광고 unit ID 로 바꾸기

adUnitId: Platform.isAndroid

? 'ca-app-pub-3940256099942544/6300978111' // Android ad unit ID

: 'ca-app-pub-3940256099942544/2934735716'// iOS ad unit ID

size: AdSize.fullBanner,

request: AdRequest(),

listener: BannerAdListener(

onAdFailedToLoad: (aderror) {

ad.dispose();

},

),

);


InterstitialAd? interstitialAd;


//InterstitialAd? get ad => null;


@override

void initState() {

// TODO: implement initState

super.initState();

myBanner.load();

}


void loadAd() {

InterstitialAd.load(

adUnitId: Platform.isAndroid

? 'ca-app-pub-3940256099942544/1033173712' // Android ad unit ID

: 'ca-app-pub-3940256099942544/4411468910',

request: const AdRequest(),

adLoadCallback: InterstitialAdLoadCallback(

// Called when an ad is successfully received.

// ignore: avoid_types_as_parameter_names

onAdLoaded: (interstitalAd) {

//debugPrint('$ad loaded.');

// Keep a reference to the ad so you can show it later.

interstitialAd = ad;

interstitialAd!.show();

},

// Called when an ad request failed.

onAdFailedToLoad: (LoadAdError error) {

debugPrint('InterstitialAd failed to load: $error');

},

),

);

}


@override

Widget build(BuildContext context) {

return Consumer<MemoService>(

builder: (contextmemoServicechild) {

// memoService로 부터 memoList 가져오기

List<MemomemoList = memoService.memoList;


return Scaffold(

appBar: AppBar(

title: Text("mymemo"),

),

body: memoList.isEmpty

? Center(child: Text("메모를 작성해 주세요"))

: ListView.builder(

itemCount: memoList.length// memoList 개수 만큼 보여주기

itemBuilder: (contextindex) {

Memo memo = memoList[index]; // index에 해당하는 memo 가져오기

return ListTile(

// 메모 고정 아이콘

leading: IconButton(

icon: Icon(memo.isPinned

? CupertinoIcons.pin_fill

: CupertinoIcons.pin),

onPressed: () {

memoService.updatePinMemo(index: index);

},

),

// 메모 내용 (최대 3줄까지만 보여주도록)

title: Text(

memo.content,

maxLines: 3,

overflow: TextOverflow.ellipsis,

),

onTap: () {

// 아이템 클릭시

Navigator.push(

context,

MaterialPageRoute(

builder: (_=> DetailPage(

index: index,

),

),

);

},

);

},

),

floatingActionButton: FloatingActionButton(

child: Icon(Icons.add),

onPressed: () {

// + 버튼 클릭시 메모 생성 및 수정 페이지로 이동

memoService.createMemo(content: '');

Navigator.push(

context,

MaterialPageRoute(

builder: (_=> DetailPage(

index: memoService.memoList.length - 1,

),

),

);

},

),

bottomNavigationBar: Container(

alignment: Alignment.center,

width: myBanner.size.width.toDouble(),

height: myBanner.size.height.toDouble(),

child: AdWidget(ad: myBanner),

),

);

},

);

}

}


// 메모 생성 및 수정 페이지

class DetailPage extends StatelessWidget {

DetailPage({super.keyrequired this.index});


final int index;


TextEditingController contentController = TextEditingController();


@override

Widget build(BuildContext context) {

MemoService memoService = context.read<MemoService>();

Memo memo = memoService.memoList[index];


contentController.text = memo.content;


return Scaffold(

appBar: AppBar(

actions: [

IconButton(

onPressed: () {

// 삭제 버튼 클릭시

showDeleteDialog(contextmemoService);

},

icon: Icon(Icons.delete),

)

],

),

body: Padding(

padding: const EdgeInsets.all(16),

child: TextField(

controller: contentController,

decoration: InputDecoration(

hintText: "메모를 입력하세요",

border: InputBorder.none,

),

autofocus: true,

maxLines: null,

expands: true,

keyboardType: TextInputType.multiline,

onChanged: (value) {

// 텍스트필드 안의 값이 변할 때

memoService.updateMemo(index: indexcontent: value);

},

),

),

);

}


void showDeleteDialog(BuildContext contextMemoService memoService) {

showDialog(

context: context,

builder: (context) {

return AlertDialog(

title: Text("정말로 삭제하시겠습니까?"),

actions: [

// 취소 버튼

TextButton(

onPressed: () {

Navigator.pop(context);

},

child: Text("취소"),

),

// 확인 버튼

TextButton(

onPressed: () {

memoService.deleteMemo(index: index);

Navigator.pop(context); // 팝업 닫기

Navigator.pop(context); // HomePage 로 가기

},

child: Text(

"확인",

style: TextStyle(color: Colors.pink),

),

),

],

);

},

);

}

}

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!




취소
 공유
취소
댓글 0
댓글 알림
나의얼굴