質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

解決済

FlutterError (setState() called after dispose(): により画面遷移がうまくいかない

Gento
Gento

総合スコア77

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

1回答

0リアクション

0クリップ

264閲覧

投稿2022/10/02 13:34

解決したい問題

「サインイン」というボタンを押したらFirebaseの匿名認証でサインインし、TOP画面に遷移したいです。

しかし、画面の遷移自体は成功するのですが、TOP画面へ遷移した直後下記のようなエラーが発生します。。

console

FlutterError (setState() called after dispose(): _IntroductionScreenState#b372c(lifecycle state: defunct, not mounted) This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback. The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree. This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().)

該当のソースコード

dart:lib/screens/introduction/introduction_screen.dart

import 'package:flutter/material.dart'; import 'package:lovedan/resources/auth_methods.dart'; import 'package:lovedan/responsive/mobile_screen_layout.dart'; import 'package:lovedan/responsive/responsive_layout.dart'; import 'package:lovedan/responsive/web_screen_layout.dart'; import 'package:lovedan/utils/utils.dart'; import 'package:lovedan/utils/colors.dart'; class IntroductionScreen extends StatefulWidget { State<IntroductionScreen> createState() => _IntroductionScreenState(); } class _IntroductionScreenState extends State<IntroductionScreen> { bool _isLoading = false; void dispose() { _isLoading = false; super.dispose(); } void signInAnonymously() async { // set loading to true setState(() { _isLoading = true; }); // signup user using our authmethodds String res = await AuthMethods().signInAnonymously(); // if string returned is sucess, user has been created if (res == "success") { setState(() { // ここでエラー _isLoading = false; }); // navigate to the home screen Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => const ResponsiveLayout( mobileScreenLayout: MobileScreenLayout(), webScreenLayout: WebScreenLayout(), ), )); } else { setState(() { _isLoading = false; }); // show the error showSnackBar(context, res); } } Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( child: !_isLoading ? const Text('はじめる') : const CircularProgressIndicator(color: primaryColor), onPressed: signInAnonymously, ), ), ); } }

dart:lib/resources/auth_methods.dart

Future signInAnonymously() async { String res = "エラーが発生しました。。。もう一度試してください。"; try { UserCredential userCredential = await _auth.signInAnonymously(); model.User _user = model.User( uid: userCredential.user!.uid, createdAt: DateTime.now(), watchingList: [], ); // adding user in our database await _firestore .collection('users') .doc(userCredential.user!.uid) .set(_user.toJson()); res = "success"; } catch (err) { res = err.toString(); print(res); } return res; }

disposeされた後にsetState関数が呼ばれているからエラーになっている、というのはわかるのですが、、どうコードを書き換えれば良いでしょうか??

試したこと

https://blog.mrym.tv/2019/12/traps-on-calling-setstate-inside-initstate/

上記を参考に以下のようにコードを変えてみました。

dart:lib/screens/introduction/introduction_screen.dart

// signup user using our authmethodds String res = await AuthMethods().signInAnonymously(); // if string returned is sucess, user has been created if (res == "success") { if (mounted) { setState(() { _isLoading = false; }); }

すると以下のようにエラー内容が変わりました。。。

console

FlutterError (This widget has been unmounted, so the State no longer has a context (and should be considered defunct). Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.)

ますます意味がわからなくなりました。。。。
何が起こっているのか、どなたかご教授いただけると幸いです🙏

参考にしたコード

https://github.com/RivaanRanawat/instagram-flutter-clone/blob/master/lib/screens/signup_screen.dart

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。