FlutterError:查找已停用小部件的祖先是不安全的

问题描述 投票:0回答:1

发生异常。
FlutterError(查找已停用的小部件的祖先是不安全的。 此时小部件的元素树的状态不再稳定。
要在其 dispose() 方法中安全地引用小部件的祖先,请通过在小部件的 didChangeDependency() 方法中调用 dependentOnInheritedWidgetOfExactType() 来保存对祖先的引用。)

catch (e) {
  ScaffoldMessenger.of(context)
        .showSnackBar(
      SnackBar(
        content: Text(
            'Error: ${e.toString()}'),
      ),
    );
  }

我制作了注册页面,firebase 工作正常,用户也已注册。

但是这个异常一再出现。

请告诉我如何修复

flutter dart
1个回答
0
投票

1。通过检查小部件是否是小部件树的一部分来解决:

如果小部件从小部件树中删除(例如,导航到不同的屏幕时),调用 ScaffoldMessenger.of(context) 将导致错误,因为 context 不再有效。 mounted 属性可确保这种情况不会发生。

catch (e) {
  // Ensure the widget is still mounted before showing the SnackBar
  if (mounted) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('Error: ${e.toString()}'),
      ),
    );
  }
}

2。使用 GlobalKey 的解决方案:

  1. 无需上下文:由于我们使用的是 GlobalKey,因此您不需要 需要传递上下文。

  2. 无需检查已安装:此方法不需要检查已安装,因为 ScaffoldMessenger 将管理其状态。

import 'package:flutter/material.dart';

/// Define a GlobalKey for the ScaffoldMessenger
final GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey =
    GlobalKey<ScaffoldMessengerState>();

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // Assign the key to the ScaffoldMessenger
      scaffoldMessengerKey: scaffoldMessengerKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SnackBar Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              /// Show the SnackBar using the ScaffoldMessenger key
              scaffoldMessengerKey.currentState?.showSnackBar(
                const SnackBar(
                  content: Text('This is a SnackBar!'),
                ),
              );
            },
            child: const Text('Show SnackBar'),
          ),
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.