Ich denke, Sie möchten vielleicht einige Hilfsfunktionen für buildIhre Schaltfläche sowie ein Stateful-Widget zusammen mit einer Eigenschaft zum Abschalten einführen .
- Verwenden Sie einen StatefulWidget / Staat und erstellen Sie eine Variable Ihren Zustand zu halten (zB
isButtonDisabled)
- Setzen Sie dies zunächst auf true (wenn Sie dies wünschen).
- Stellen Sie beim Rendern der Schaltfläche den
onPressed Wert nicht direkt auf eine nulloder mehrere Funktionen einonPressed: () {}
- Stellen Sie es stattdessen bedingt mit einer ternären oder einer Hilfsfunktion ein (Beispiel unten).
- Überprüfen Sie dies
isButtonDisabledals Teil dieser Bedingung und geben Sie eine nulloder mehrere Funktionen zurück.
- Wenn die Taste gedrückt wird (oder wenn Sie die Taste deaktivieren möchten), verwenden Sie
setState(() => isButtonDisabled = true)diese Option, um die bedingte Variable umzudrehen.
- Flutter ruft die
build()Methode mit dem neuen Status erneut auf und die Schaltfläche wird mit einem nullDruckhandler gerendert und deaktiviert.
Hier ist etwas mehr Kontext mit dem Flutter Counter-Projekt.
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 diesem Beispiel verwende ich ein Inline-Ternär, um das Textund bedingt festzulegen onPressed, aber es ist möglicherweise besser für Sie, dies in eine Funktion zu extrahieren (Sie können dieselbe Methode verwenden, um auch den Text der Schaltfläche zu ändern):
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();
};
}
}