Je pense que vous voudrez peut-être introduire des fonctions d'aide à build
votre bouton ainsi qu'un widget Stateful avec une propriété à désactiver.
- Utilisez un StatefulWidget / State et créez une variable pour contenir votre condition (par exemple
isButtonDisabled
)
- Réglez ceci sur true au départ (si c'est ce que vous désirez)
- Lors du rendu du bouton, ne définissez pas directement la
onPressed
valeur sur l'une null
ou l' autre fonctiononPressed: () {}
- Au lieu de cela , définissez-le conditionnellement à l'aide d'une fonction ternaire ou d'assistance (exemple ci-dessous)
- Vérifiez le
isButtonDisabled
dans le cadre de cette condition et retournez l'une null
ou l' autre fonction.
- Lorsque vous appuyez sur le bouton (ou chaque fois que vous souhaitez désactiver le bouton), utilisez
setState(() => isButtonDisabled = true)
pour inverser la variable conditionnelle.
- Flutter appellera à
build()
nouveau la méthode avec le nouvel état et le bouton sera rendu avec un null
gestionnaire de presse et sera désactivé.
Voici un peu plus de contexte en utilisant le projet de compteur Flutter.
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
bool _isButtonDisabled;
@override
void initState() {
_isButtonDisabled = false;
}
void _incrementCounter() {
setState(() {
_isButtonDisabled = true;
_counter++;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("The App"),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(
'You have pushed the button this many times:',
),
new Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
_buildCounterButton(),
],
),
),
);
}
Widget _buildCounterButton() {
return new RaisedButton(
child: new Text(
_isButtonDisabled ? "Hold on..." : "Increment"
),
onPressed: _isButtonDisabled ? null : _incrementCounter,
);
}
}
Dans cet exemple, j'utilise un ternaire en ligne pour définir conditionnellement le Text
et onPressed
, mais il peut être plus approprié pour vous de l'extraire dans une fonction (vous pouvez également utiliser cette même méthode pour modifier le texte du bouton):
Widget _buildCounterButton() {
return new RaisedButton(
child: new Text(
_isButtonDisabled ? "Hold on..." : "Increment"
),
onPressed: _counterButtonPress(),
);
}
Function _counterButtonPress() {
if (_isButtonDisabled) {
return null;
} else {
return () {
// do anything else you may want to here
_incrementCounter();
};
}
}