Flutter Snackbar解除监听器

19

我正在寻找一种方法来检查Snackbar是否被用户或超时关闭。我无法找到任何监听器来做到这一点。

到目前为止,这就是我得到的。

Scaffold.of(context)
    .showSnackBar(SnackBar(content: Text("Title")))
    .closed
    .then((reason) {
  // snackbar is now closed
});

这是我在找寻的唯一解决方案,我不想要任何折中办法,例如设置Snackbarduration,然后等待持续时间结束后再监听。


9
这不是解决方法:请参考SnackBarClosedReason - pskink
@pskink 是的,这就是我正在使用的,但问题在于当您按返回按钮关闭屏幕时,原因块不会被调用。 - user6274128
当您点击返回按钮以检测该行为时,返回某些内容。使用return new WillPopScope( onWillPop: () async { return _doSomeChecks(context); }, child: SafeArea( ... - Dani
1个回答

9

下面是完整示例

我刚刚使用WillPopScope包装了SnackBar内容,如果用户按下返回按钮,它将删除Snackbar。
默认情况下,它将指定SnackBarClosedReason.remove原因

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: FirstPage(),
      ),
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        child: Text('go to test page'),
        onPressed: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => Test())),
      ),
    );
  }
}

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          child: Text('show snack'),
          onPressed: () => _showSnack(context),
        ),
      ),
    );
  }

  void _showSnack(BuildContext context) {
    ScaffoldMessenger.of(context)
        .showSnackBar(
          SnackBar(
            content: WillPopScope(
              onWillPop: () async {
                ScaffoldMessenger.of(context).removeCurrentSnackBar();
                return true;
              },
              child: Text("Title"),
            ),
          ),
        )
        .closed
        .then((reason) {
      print('------------ $reason');
    });
  }
}

非常感谢,它像魔法一样奏效。我已经寻找这个解决方案两天了。再次感谢 :) - Kamlesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接