Flutter Snackbar 关闭监听器

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

我正在寻找一种方法来检查

Snackbar
是否已被用户或超时问题解除。我真的无法让任何听众这样做。

这是我到目前为止所得到的,

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

这是一种方法,我一直在寻找确切的听众。我不想做任何解决办法,比如设置

duration
Snackbar
,然后在持续时间过去后收听它。

dart flutter
2个回答
10
投票

请参阅下面的完整示例 我刚刚用

SnackBar
包裹了
WillPopoScope
内容,如果用户按下后退按钮,它将删除小吃栏。
默认情况下它会指定
SnackBarClosedReason.remove
原因

导入'包: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');
    });
  }
}

0
投票

尝试使用下面的代码片段

ScaffoldMessenger.of(context).hideCurrentSnackBar();
© www.soinside.com 2019 - 2024. All rights reserved.