Saya pikir Anda mungkin ingin memperkenalkan beberapa fungsi pembantu ke build
tombol Anda serta widget Stateful bersama dengan beberapa properti untuk dimatikan.
- Gunakan StatefulWidget / State dan buat variabel untuk menampung kondisi Anda (misalnya
isButtonDisabled
)
- Setel ini menjadi benar pada awalnya (jika itu yang Anda inginkan)
- Saat merender tombol, jangan langsung menyetel
onPressed
nilainya ke salah satu null
atau beberapa fungsionPressed: () {}
- Sebaliknya , setel secara kondisional menggunakan terner atau fungsi pembantu (contoh di bawah)
- Periksa
isButtonDisabled
sebagai bagian dari kondisional ini dan kembalikan salah satu null
atau beberapa fungsi.
- Saat tombol ditekan (atau kapan pun Anda ingin menonaktifkan tombol) gunakan
setState(() => isButtonDisabled = true)
untuk membalik variabel bersyarat.
- Flutter akan memanggil
build()
metode lagi dengan status baru dan tombol akan ditampilkan dengan null
penangan pers dan dinonaktifkan.
Berikut adalah beberapa konteks lainnya menggunakan proyek penghitung 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,
);
}
}
Dalam contoh ini saya menggunakan terner sebaris untuk mengatur Text
dan secara kondisional onPressed
, tetapi mungkin lebih sesuai bagi Anda untuk mengekstrak ini ke dalam fungsi (Anda dapat menggunakan metode yang sama ini untuk mengubah teks tombol juga):
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();
};
}
}