Penso che potresti voler introdurre alcune funzioni di supporto al buildtuo pulsante e un widget Stateful insieme ad alcune proprietà da cui disattivare.
- Usa un widget Stateful / State e crea una variabile per mantenere la tua condizione (ad es.
isButtonDisabled)
- Impostalo inizialmente su true (se è quello che desideri)
- Durante il rendering del pulsante, non impostare direttamente il
onPressed valore su nessuna delle due nullfunzionionPressed: () {}
- Invece , impostalo in modo condizionale usando una funzione ternaria o di aiuto (esempio sotto)
- Controlla
isButtonDisabledcome parte di questo condizionale e restituisci una nullo qualche funzione.
- Quando si preme il pulsante (o ogni volta che si desidera disabilitare il pulsante) utilizzare
setState(() => isButtonDisabled = true)per capovolgere la variabile condizionale.
- Flutter chiamerà
build()nuovamente il metodo con il nuovo stato e il pulsante verrà renderizzato con un nullpress handler e sarà disabilitato.
Ecco un po 'più di contesto usando il progetto Flutter counter.
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,
);
}
}
In questo esempio sto usando un ternario in linea per impostare condizionalmente Texte onPressed, ma potrebbe essere più appropriato estrarlo in una funzione (puoi usare lo stesso metodo anche per cambiare il testo del pulsante):
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();
};
}
}