Флаттер: как «отключить» касание во время показа закусочной - PullRequest
0 голосов
/ 20 октября 2019

RaisedButton вызывает Snackbar и имеет 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++;
                });
              });
            }),

1 Ответ

0 голосов
/ 20 октября 2019

Вы можете использовать Future, возвращаемое showSnackBar для управления поведением. Для отключения постукивания вы можете использовать виджет 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);
  }
}

...