Flutterのコツをつかみ始めたばかりですが、ボタンの有効状態を設定する方法がわかりません。
ドキュメントから、ボタンを無効にするにはonPressed
をnullに設定し、ボタンを有効にするには値を指定するように指示されています。ライフサイクルの間、ボタンが同じ状態のままである場合、これは問題ありません。
何らかの方法でボタンの有効状態(またはonPressedコールバック)を更新できるカスタムステートフルウィジェットを作成する必要があるという印象を受けます。
だから私の質問はどうすればいいですか?これは非常に簡単な要件のように思えますが、その方法に関するドキュメントには何も見つかりません。
ありがとう。
ボタンのbuild
にヘルパー関数を導入し、キーオフするプロパティとともにステートフルウィジェットを導入するとよいと思います。
isButtonDisabled
)onPressed
値をnull
または何らかの関数onPressed: () {}
に直接設定しないでください。isButtonDisabled
を確認し、null
または何らかの関数を返します。setState(() => isButtonDisabled = true)
を使用して条件変数を反転します。build()
メソッドを新しい状態で再度呼び出し、ボタンはnull
プレスハンドラーでレンダリングされ、無効になります。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,
);
}
}
この例では、インライン変数を使用してText
とonPressed
を条件付きで設定していますが、これを関数に抽出する方が適切な場合があります(この同じメソッドを使用してボタンのテキストも変更できます)。
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();
};
}
}
ドキュメントによると:
「onPressedコールバックがnullの場合、ボタンは無効になり、デフォルトではdisabledColorのフラットボタンに似ています。」
https://docs.flutter.io/flutter/material/RaisedButton-class.html
だから、あなたはこのようなことをするかもしれません:
RaisedButton(
onPressed: calculateWhetherDisabledReturnsBool() ? null : () => whatToDoOnPressed,
child: Text('Button text')
);
簡単な答えは、onPressed : null
は無効なボタンを提供します。
特定の限られた数のウィジェットの場合、ウィジェットでラップする IgnorePointer はまさにこれを行います:ignoring
プロパティがtrueに設定されている場合、サブウィジェット(実際には、サブツリー全体)クリックできません。
IgnorePointer(
ignoring: true, // or false
child: RaisedButton(
onPressed: _logInWithFacebook,
child: Text("Facebook sign-in"),
),
),
それ以外の場合、サブツリー全体を無効にする場合は、AbsorbPointer()を調べます。
有効化と無効化の機能は、ほとんどのウィジェットで同じです。
例、ボタン、スイッチ、チェックボックスなど.
以下に示すようにonPressed
プロパティを設定するだけです
onPressed : null
は無効なウィジェットを返します
onPressed : (){}
またはonPressed : _functionName
は、有効なウィジェットを返します
このようなボタンを有効または無効にすることができます
RaisedButton(onPressed: isEnabled ? _handleClick : null)
AbsorbPointerを使用することもでき、次の方法で使用できます。
AbsorbPointer(
absorbing: true, // by default is true
child: RaisedButton(
onPressed: (){
print('pending to implement onPressed function');
},
child: Text("Button Click!!!"),
),
),
このウィジェットについて詳しく知りたい場合は、次のリンクを確認してください Flutter Docs