• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Flutter 게시판 자식 위젯이 부모 위젯의 state 변경시 에러.

자식 위젯이 부모 위젯의 state 변경시 에러.

2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #59797

    트리플
    참가자
    addOne() {
       setState(() {
        total++;
       });
    }
    
    부모 state 의 total 을 변경하려고 setState 블록안에서 total++을 실행아면 아래와 같은 에러가 발생합니다.
    정확히는 다이얼로그를 띄우려고 플로팅 버튼을 클릭시 발생합니다.
    setState를 제거하면 에러는 발생하지 않습니다.
    
    
    
    전체 코드 첨부합니다.
    
    import 'package:flutter/material.dart';
    void main() {
      runApp(
          MaterialApp(home: MyAppState())
      );
    }
    class MyAppState extends StatefulWidget {
      const MyAppState({Key? key}) : super(key: key);
      @override
      State<MyAppState> createState() => _MyAppStateState();
    }
    class _MyAppStateState extends State<MyAppState> {
      var total = 3;
      var names = ["김영숙", "홍길동", "피자집"];
      List<dynamic> likes = [0, 0, 0];
      addOne() {
        setState(() {
          total++;
        });
      }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              showDialog(
                  context: context,
                  builder: (c) {
                    return DialogUi(addOne: addOne());
                  });
            },
            child: Text("dialog"),
          ),
          appBar: AppBar(title: Text(total.toString())),
        );
      }
    }
    class DialogUi extends StatelessWidget {
      const DialogUi({Key? key, this.addOne}) : super(key: key);
      final addOne;
      @override
      Widget build(BuildContext context) {
        return Dialog(
          child: Container(
            padding: EdgeInsets.all(20),
            width: 300,
            height: 300,
            child: Column(
              children: [
                TextField(),
                TextButton(onPressed: () {
                  addOne();
                }, child: Text('완료')),
                TextButton(onPressed: () {
                  Navigator.pop(context);
                }, child: Text('취소'))
              ],
            ),
          ),
        );
      }
    }
    #59798

    트리플
    참가자
    자답입니다.
    
    return DialogUi(addOne: addOne());
    -> 
    return DialogUi(addOne: addOne);
    
    함수가 아니라 변수로 넘겨줘야 하네요.
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠