本記事はFlutterを使ったWordleクローンアプリ開発日記のpart4になります
以前の記事:
【アプリ開発日記】アプリを開発するにあたっての流れとコツ【part1】
【アプリ開発日記】Widgetを切り出して作成する【part2】
【アプリ開発日記】ブロックのWidgetを作成する【part3】
キーボードのイベントをmain.dartまで通知する
part2で作成したキーボードWidgetから通知するために、SoftwareKeyBoartクラスとKeyButtonクラスのコンストラクタをコールバック関数を引数に持つように修正します。
以下は修正箇所を抜粋したコードです。GestureDetectorからコールバックを受けたonTapを通じて、さらに親のWidgetへ通知するようなイメージです。今回は追加した関数(Functionで定義しているもの)をnon-nullとしているためそのまま呼び出していますが、null 許容する場合はnullチェックが必要になるので注意しましょう。
class SoftwareKeyBoard extends StatelessWidget { const SoftwareKeyBoard({ Key? key, required this.onTapKey, required this.onTapEnterKey, required this.onTapDeleteKey }) : super(key: key); // コールバック用関数を追加。親Widgetで条件文を追加しなくて済むよう、 // EnterとDeleteキー用のコールバック関数を定義している final Function(String) onTapKey; final Function() onTapEnterKey; final Function() onTapDeleteKey; @override Widget build(BuildContext context) { // 中略 } /// 文字一覧からKeyButtonのリストを生成する List<KeyButton> createLine(List<String> list) { List<KeyButton> buttonList = []; for (String char in list) { // KeyButtonのonTapが呼ばれると、さらに親のWidgetへ通知できるよう、それぞれ追加したコールバック関数を呼び出す buttonList.add(KeyButton(char: char, onTap: () { if (char == 'ENTER') { onTapEnterKey(); } else if (char == 'DEL') { onTapDeleteKey(); } else { onTapKey(char); } })); } return buttonList; } } class KeyButton extends StatelessWidget { final String char; const KeyButton({ Key? key, required this.char, required this.onTap }) : super(key: key); final Function() onTap; // コールバック用関数追加 @override Widget build(BuildContext context) { // 中略 return GestureDetector( onTap: () { onTap(); // GestureDetectorのonTapをそのまま通知する }, child: Container( margin: const EdgeInsets.all(4), decoration: BoxDecoration( color: Colors.grey[350], borderRadius: BorderRadius.circular(3), ), width: width.toDouble(), height: 45, alignment: Alignment.center, child: w, ), ); } }
最後に、main.dart側のScaffold内でインスタンスを生成する時にコールバック用の処理を追記します。これで、キーボードのボタンを押すと、main.dart(の中のScaffold)へ通知することができました。
SoftwareKeyBoard( onTapEnterKey: () { debugPrint('onTapEnterKey'); }, onTapKey: (String char) { debugPrint('onTap : $char'); }, onTapDeleteKey: () { debugPrint('onTapDeleteKey'); }, ),
part5へ続く
コメントを残す