Tôi nghĩ rằng bạn có thể muốn giới thiệu một số chức năng trợ giúp cho build
nút của mình cũng như tiện ích Stateful cùng với một số thuộc tính để khóa.
- Sử dụng StatefulWidget / State và tạo một biến để giữ điều kiện của bạn (ví dụ
isButtonDisabled
:)
- Đặt điều này thành true ban đầu (nếu đó là điều bạn mong muốn)
- Khi hiển thị nút, không đặt trực tiếp
onPressed
giá trị cho một null
hoặc một số chức năngonPressed: () {}
- Thay vào đó , hãy đặt nó có điều kiện bằng cách sử dụng hàm bậc ba hoặc hàm trợ giúp (ví dụ bên dưới)
- Kiểm tra
isButtonDisabled
như một phần của điều kiện này và trả về một null
hoặc một số hàm.
- Khi nút được nhấn (hoặc bất cứ khi nào bạn muốn tắt nút) sử dụng
setState(() => isButtonDisabled = true)
để lật biến điều kiện.
- Flutter sẽ gọi lại
build()
phương thức với trạng thái mới và nút sẽ được hiển thị bằng null
trình xử lý báo chí và bị vô hiệu hóa.
Đây là một số ngữ cảnh khác sử dụng dự án bộ đếm 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,
);
}
}
Trong ví dụ này, tôi đang sử dụng một bậc ba nội dòng để đặt có điều kiện Text
và onPressed
, nhưng có thể thích hợp hơn để bạn trích xuất nó thành một hàm (bạn cũng có thể sử dụng cùng một phương pháp này để thay đổi văn bản của nút):
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();
};
}
}