首页 > 解决方案 > Flutter:如何在显示小吃店时“禁用”触摸

问题描述

RaisedButton 将调用 Snackbar 并具有 setState()。但是,屏幕在 Setstate 更改之前是可点击的,下面是代码的一部分:

        child: RaisedButton(
            child: Text('Click Me'),
            onPressed: () {
              theMessage = getMessage();
              Scaffold.of(context).showSnackBar(SnackBar(content: Text(theMessage), duration: Duration(seconds: 3),
              ));

              _timer = new Timer(const Duration(seconds: 3), () {
                setState(() {
                  n++;
                });
              });
            }),

标签: fluttersetstatesnackbar

解决方案


您可以使用Future返回的 byshowSnackBar来控制行为。要禁用点击,您可以使用小部件AbsorbPointer。这是一个同时使用它们的示例:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _absorbing = false;
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  void _onButtonPress() {
    setState(() {
      _absorbing = true;
    });
    print("Do your work here");
    snackBarWithCallback("Hello", () {
      print("Done");
      setState(() {
        _absorbing = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: AbsorbPointer(
        absorbing: _absorbing,
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              RaisedButton(
                child: Text('Pres Me'),
                onPressed: _onButtonPress,
              ),
            ],
          ),
        ),
      ),
    );
  }

  void snackBarWithCallback(String content, VoidCallback callback) {
    final controller = _scaffoldKey.currentState.showSnackBar(
      SnackBar(
        content: Text(content),
      ),
    );
    controller.closed.whenComplete(callback);
  }
}


推荐阅读