为什么有时小吃店会失败

Why sometimes snackbar is failing

请帮忙解释为什么有时我的 SnackBar 会显示错误。我不明白问题会在什么情况下出现。我只想指出,即使它显示错误,但在应用程序本身中,它运行正常。

这是我的代码:

void showFailedSnackBar(String s) {
    SnackBar snackBar = SnackBar(
      content: Text(s),
      duration: Duration(seconds: 3),
      backgroundColor: Theme.of(context).primaryColor,
    );

    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

这是错误:

E/flutter ( 7879): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
E/flutter ( 7879): Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.

尝试检查三个widget是否仍然挂载:

void showFailedSnackBar(String s) {
    if (mounted) {
    SnackBar snackBar = SnackBar(
      content: Text(s),
      duration: Duration(seconds: 3),
      backgroundColor: Theme.of(context).primaryColor,
    );

    ScaffoldMessenger.of(context).showSnackBar(snackBar);
    }

  }

在您的函数 showSnackbar 中,除了字符串之外,您还可以传递一个 BuildContext 上下文变量,这样您就知道传递了哪个上下文,例如

    SnackBar snackBar = SnackBar(
      content: Text(s),
      duration: Duration(seconds: 3),
      backgroundColor: Theme.of(context).primaryColor,
    );

    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  }

您可以保存您确信它存在于提供程序中的脚手架的上下文,以便将它传递到您需要它的地方。

https://velog.io/@namtaehyun/Flutter-This-widget-has-been-unmounted-so-the-State-no-longer-has-a-context

main.dart 中定义全局导航器上下文,并在任何地方使用它

// main.dart

final navigatorKey = GlobalKey<NavigatorState>(); // define global key

void main() => runApp(
  MaterialApp(
    ...
    navigatorKey: navigatorKey, // propagate to all descendant contexts
  ),
);


// other.dart

void showMyDialog() {
  showDialog(
    context: navigatorKey.currentContext, // reference global context
    builder: (context) => ...
  );
}

像这样使用 SnackBar

import 'package:flutter/material.dart';

void main() => runApp(const SnackBarDemo());

class SnackBarDemo extends StatelessWidget {
  const SnackBarDemo({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SnackBar Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('SnackBar Demo'),
        ),
        body: const SnackBarPage(),
      ),
    );
  }
}

class SnackBarPage extends StatelessWidget {
  const SnackBarPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {
          final snackBar = SnackBar(
            content: const Text('Yay! A SnackBar!'),
            action: SnackBarAction(
              label: 'Undo',
              onPressed: () {
                // Some code to undo the change.
              },
            ),
          );

          // Find the ScaffoldMessenger in the widget tree
          // and use it to show a SnackBar.
          ScaffoldMessenger.of(context).showSnackBar(snackBar);
        },
        child: const Text('Show SnackBar'),
      ),
    );
  }
}