Flutter Unhandled 예외 : 비활성화 된 위젯의 조상을 찾는 것은 안전하지 않습니다.

qwea

대화 상자에서 버튼을 누른 후 로딩 화면을 시도했습니다. 대화 상자에서 버튼을 누르면 프로그램이 먼저 대화 상자를 표시 한 다음 2 초 동안 WillPopScope 개체를 표시 한 다음로드 화면을 표시합니다. 코드는 다음과 같습니다.

onPressed: () async {
  Navigator.pop(context);
  loadingScreen(context);
  await Future.delayed(Duration(seconds: 2));
  Navigator.pop(context);
},

하지만 다음과 같은 오류가 표시됩니다.

E/flutter (14960): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter (14960): At this point the state of the widget's element tree is no longer stable.
E/flutter (14960): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

몇 가지 연구 끝에 존재하지 않는 팝업 컨텍스트로 인해이 오류가 발생했다고 생각하므로 지연 후 대화 상자와 로딩 화면을 동시에 팝업하려고했습니다.

onPressed: () async {
  loadingScreen(context);
  await Future.delayed(Duration(seconds: 2));
  Navigator.pop(context);
  Navigator.pop(context);
},

작동하지만 정확히 내가 원하는 것은 아니지만 그 이유가 정말로 혼란 스럽습니다. 아무도 나에게 무슨 일이 일어나고 있는지 설명해 주시고 해결할 방법이 있습니까?

전체 코드 :

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> {
  Future<void> loadingScreen(BuildContext context) async {
    return showDialog(
        context: context,
        builder: (context) {
          return WillPopScope(
              onWillPop: () => Future.value(false), child: Text(''));
        });
  }

  dialog(BuildContext context) {
    return showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: Text('Show Loading Screen'),
          actions: <Widget>[
            TextButton(
              child: Text('Okay'),
              onPressed: () async {
                Navigator.pop(context);
                loadingScreen(context);
                await Future.delayed(Duration(seconds: 2));
                Navigator.pop(context);
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Demo'),
        ),
        body: Center(
            child: TextButton(
                child: Text('Show Dialog'),
                onPressed: () {
                  dialog(context);
                })));
  }
}
lrsvmb

주요 오류는 변수 이름 지정에 있습니다. 대화 상자 함수를

Widget build(BuildContext context)...

해당 함수에 대한 인수로 BuildContext가 있고 해당 컨텍스트를 대화 상자에 사용합니다. 더 잘 이해할 수 있도록 변수 이름을 변경하겠습니다.

dialog(BuildContext contextFromBuild) {  //this is the argument to the function
    return showDialog(
      context: contextFromBuild,
      builder: (BuildContext contextInsideDialog) { //new BuildContext inside the dialog
        return AlertDialog(
          content: Text('Show Loading Screen'),
          actions: <Widget>[
            TextButton(
              child: Text('Okay'),
              onPressed: () async {
                Navigator.pop(contextInsideDialog);
                loadingScreen(contextInsideDialog);
                await Future.delayed(Duration(seconds: 2));
                Navigator.pop(contextInsideDialog);
              },
            ),
          ],
        );
      },
    );

보시다시피 contextInsideDialog를 표시하고 있지만 다음에서 액세스하려고합니다.

loadingScreen(contextInsideDialog);

이미 해당 컨텍스트 (contextInsideDialog)를 팝했기 때문에 오류가 발생합니다. 변수 이름을 변경하여 문제를 해결하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

내 PopupMenuItem에서 "비활성화 된 위젯의 조상을 찾는 것은 안전하지 않습니다"라는 메시지가 나타나는 이유는 무엇입니까?

분류에서Dev

htaccess에 미리 정의 된 것을 제외한 모든 하위 도메인을 비활성화합니다.

분류에서Dev

비활성화 된 속성을 하위 구성 요소의 HTML 요소에 전달하는 기능이 작동하지 않습니다.

분류에서Dev

Tkinter Scale 위젯의 상태를 비활성화하는 방법은 무엇입니까?

분류에서Dev

Flutter : 처리되지 않은 예외 : 잘못된 상태 : 필드가 DocumentSnapshotPlatform 내에 존재하지 않습니다.

분류에서Dev

Flutter Desktop : 버튼을 가리키면 "비활성화 된"마우스 커서를 비활성화하는 방법은 무엇입니까?

분류에서Dev

Wi-Fi가 비활성화 된 후 다시 활성화되는 것을 중지하는 방법

분류에서Dev

wx 파이썬 위젯에서 크기 조정을 비활성화하는 방법은 무엇입니까?

분류에서Dev

Android 앱 위젯에서 진행률 대화 상자를 추가하는 동안 잘못된 토큰 예외가 발생했습니다.

분류에서Dev

Guzzle이 인증서 확인을 거짓으로 비활성화하는 것은 얼마나 안전하지 않습니까?

분류에서Dev

Flutter : 다른 유형의 위젯이 포함 된 ListView.builder 끝에 버튼 위젯을 추가하는 방법은 무엇입니까?

분류에서Dev

Flutter 오류-머티리얼 조상을 찾을 수없는 특정 위젯은 다음과 같습니다.

분류에서Dev

Android의 다른 조각에서 버튼을 활성화 / 비활성화하는 방법은 무엇입니까?

분류에서Dev

MSBuild에서 PackageReference의 (전 이적) 종속성을 제외 (비활성화)하는 방법은 무엇입니까?

분류에서Dev

MSBuild에서 PackageReference의 (전 이적) 종속성을 제외 (비활성화)하는 방법은 무엇입니까?

분류에서Dev

Android Studio 2.0-이 버전의 Android Studio는 사용 된 Gradle 플러그인과 호환되지 않습니다. Instant Run을 비활성화하십시오.

분류에서Dev

비활성화 된 텍스트 상자는 더 이상 뒤로 버튼을 눌러도 비활성화되지 않습니다.

분류에서Dev

n <version> 명령은 지정된 버전을 활성화하지 않습니다.

분류에서Dev

드라이버를 설치하기 전에 보안 정책 시행을 비활성화하는 것은 얼마나 위험합니까?

분류에서Dev

Flutter Wrap 위젯의 Text 위젯을 이전 위젯의 끝에서 시작하고 이전 위젯 아래에서 시작하지 않는 방법은 무엇입니까?

분류에서Dev

비활성화 된 장치가 새 버전의 앱 베타 버전을 설치하지 못하도록하는 방법은 무엇입니까?

분류에서Dev

비활성화 된 선택 옵션이 기본값으로 선택된 양식은 유효성 검사를 위해 아무것도 보내지 않습니다.

분류에서Dev

beforeShowDay는 이번 달의 일을 비활성화하지 않습니다.

분류에서Dev

비활성화 된 JTabbedPane의 탭이 활성화되었을 때와 똑같이 보이도록 유지하는 방법은 무엇입니까?

분류에서Dev

pythons의 요청 lib에서 SSL 인증서 확인을 비활성화하는 것이 안전합니까?

분류에서Dev

비활성화 된 속성을 사용하지 않고 라디오 버튼을 비활성화하는 방법은 무엇입니까?

분류에서Dev

ElevatedButton의 비활성화 된 색상을 변경하는 방법

분류에서Dev

HTML 양식 재설정은 비활성화 된 속성을 복원하지 않습니다.

분류에서Dev

Kendo TimePicker의 비활성화 된 속성을 변경하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    내 PopupMenuItem에서 "비활성화 된 위젯의 조상을 찾는 것은 안전하지 않습니다"라는 메시지가 나타나는 이유는 무엇입니까?

  2. 2

    htaccess에 미리 정의 된 것을 제외한 모든 하위 도메인을 비활성화합니다.

  3. 3

    비활성화 된 속성을 하위 구성 요소의 HTML 요소에 전달하는 기능이 작동하지 않습니다.

  4. 4

    Tkinter Scale 위젯의 상태를 비활성화하는 방법은 무엇입니까?

  5. 5

    Flutter : 처리되지 않은 예외 : 잘못된 상태 : 필드가 DocumentSnapshotPlatform 내에 존재하지 않습니다.

  6. 6

    Flutter Desktop : 버튼을 가리키면 "비활성화 된"마우스 커서를 비활성화하는 방법은 무엇입니까?

  7. 7

    Wi-Fi가 비활성화 된 후 다시 활성화되는 것을 중지하는 방법

  8. 8

    wx 파이썬 위젯에서 크기 조정을 비활성화하는 방법은 무엇입니까?

  9. 9

    Android 앱 위젯에서 진행률 대화 상자를 추가하는 동안 잘못된 토큰 예외가 발생했습니다.

  10. 10

    Guzzle이 인증서 확인을 거짓으로 비활성화하는 것은 얼마나 안전하지 않습니까?

  11. 11

    Flutter : 다른 유형의 위젯이 포함 된 ListView.builder 끝에 버튼 위젯을 추가하는 방법은 무엇입니까?

  12. 12

    Flutter 오류-머티리얼 조상을 찾을 수없는 특정 위젯은 다음과 같습니다.

  13. 13

    Android의 다른 조각에서 버튼을 활성화 / 비활성화하는 방법은 무엇입니까?

  14. 14

    MSBuild에서 PackageReference의 (전 이적) 종속성을 제외 (비활성화)하는 방법은 무엇입니까?

  15. 15

    MSBuild에서 PackageReference의 (전 이적) 종속성을 제외 (비활성화)하는 방법은 무엇입니까?

  16. 16

    Android Studio 2.0-이 버전의 Android Studio는 사용 된 Gradle 플러그인과 호환되지 않습니다. Instant Run을 비활성화하십시오.

  17. 17

    비활성화 된 텍스트 상자는 더 이상 뒤로 버튼을 눌러도 비활성화되지 않습니다.

  18. 18

    n <version> 명령은 지정된 버전을 활성화하지 않습니다.

  19. 19

    드라이버를 설치하기 전에 보안 정책 시행을 비활성화하는 것은 얼마나 위험합니까?

  20. 20

    Flutter Wrap 위젯의 Text 위젯을 이전 위젯의 끝에서 시작하고 이전 위젯 아래에서 시작하지 않는 방법은 무엇입니까?

  21. 21

    비활성화 된 장치가 새 버전의 앱 베타 버전을 설치하지 못하도록하는 방법은 무엇입니까?

  22. 22

    비활성화 된 선택 옵션이 기본값으로 선택된 양식은 유효성 검사를 위해 아무것도 보내지 않습니다.

  23. 23

    beforeShowDay는 이번 달의 일을 비활성화하지 않습니다.

  24. 24

    비활성화 된 JTabbedPane의 탭이 활성화되었을 때와 똑같이 보이도록 유지하는 방법은 무엇입니까?

  25. 25

    pythons의 요청 lib에서 SSL 인증서 확인을 비활성화하는 것이 안전합니까?

  26. 26

    비활성화 된 속성을 사용하지 않고 라디오 버튼을 비활성화하는 방법은 무엇입니까?

  27. 27

    ElevatedButton의 비활성화 된 색상을 변경하는 방법

  28. 28

    HTML 양식 재설정은 비활성화 된 속성을 복원하지 않습니다.

  29. 29

    Kendo TimePicker의 비활성화 된 속성을 변경하는 방법은 무엇입니까?

뜨겁다태그

보관