flutter - 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++;
});
});
}),
解决方案
您可以使用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);
}
}