Je pense que vous pouvez introduire des fonctions d'aide pour build
votre bouton ainsi qu'un widget d'état et une propriété à utiliser.
- Utilisez un StatefulWidget/State et créez une variable pour contenir votre condition (par ex.
isButtonDisabled
)
- Définissez cette valeur comme vraie au départ (si c'est ce que vous souhaitez).
- Lors du rendu du bouton, ne définissent pas directement les
onPressed
à l'une ou l'autre des valeurs suivantes null
ou une fonction onPressed: () {}
-
Au lieu de cela, , le fixer conditionnellement en utilisant un ternaire ou une fonction d'aide (exemple ci-dessous)
- Vérifiez le
isButtonDisabled
dans le cadre de cette condition et retourner soit null
ou une fonction quelconque.
- Lorsque le bouton est enfoncé (ou à chaque fois que vous souhaitez le désactiver), utilisez la fonction
setState(() => isButtonDisabled = true)
pour retourner la variable conditionnelle.
- Flutter appellera le
build()
avec le nouvel état, et le bouton sera rendu avec une icône de type null
le manipulateur de presse et être 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 de manière conditionnelle l'option Text
et onPressed
mais il est peut-être plus approprié pour vous d'extraire cela 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();
};
}
}
0 votes
Pouvez-vous préciser ce que vous entendez par "Cela convient si le bouton reste dans le même état pendant tout le cycle de vie" ? ?