커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
3주차 메모 핀 기능 에러가 뜹니다.
[왕초보] 플러터(Flutter)로 시작하는 앱개발 종합반 v0
3주차
북마크
성*진
댓글
10
추천
0
조회수
27
조회수
27
답변 완료

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

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



3주차 메모 핀 기능 에러가 뜹니다.



스파르타 즉문즉답



import 'package:flutter/cupertino.dart';

import 'package:flutter/material.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();

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<HomePage> createState() => _HomePageState();

}


class _HomePageState extends State<HomePage> {

@override

Widget build(BuildContext context) {

return Consumer<MemoService>(

builder: (context, memoService, child) {

// memoService로 부터 memoList 가져오기

List<Memo> memoList = memoService.memoList;


return Scaffold(

appBar: AppBar(

title: Text("mymemo"),

),

body: memoList.isEmpty

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

: ListView.builder(

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

itemBuilder: (context, index) {

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: () async {

// 아이템 클릭시

await Navigator.push(

context,

MaterialPageRoute(

builder: (_) => DetailPage(

index: index,

),

),

); // 해당 메모가 비어있으면 삭제하는 로직

},

);

},

),

floatingActionButton: FloatingActionButton(

child: Icon(Icons.add),

onPressed: () async {

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

memoService.createMemo(content: '');

await Navigator.push(

context,

MaterialPageRoute(

builder: (_) => DetailPage(

index: memoService.memoList.length - 1,

),

),

); // 비어있으면 삭제

},

),

);

},

);

}

}


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

class DetailPage extends StatelessWidget {

DetailPage({super.key, required 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(context, memoService); // 삭제 버튼 클릭시

},

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: index, content: value);

},

),

),

);

}


void showDeleteDialog(BuildContext context, MemoService memoService) {

showDialog(

context: context,

builder: (context) {

return AlertDialog(

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

actions: [

// 취소 버튼

TextButton(

onPressed: () {

Navigator.pop(context);

},

child: Text("취소"),

),

// 확인 버튼

TextButton(

onPressed: () {

memoService.deleteMemo(index: index); // index에 해당하는 항목 삭제

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

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

},

child: Text(

"확인",

style: TextStyle(color: Colors.pink),

),

),

],

);

},

);

}

}





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