Ich denke, Sie möchten vielleicht einige Hilfsfunktionen für build
Ihre 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 null
oder mehrere Funktionen einonPressed: () {}
- Stellen Sie es stattdessen bedingt mit einer ternären oder einer Hilfsfunktion ein (Beispiel unten).
- Überprüfen Sie dies
isButtonDisabled
als Teil dieser Bedingung und geben Sie eine null
oder 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 null
Druckhandler 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 Text
und 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();
};
}
}