mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

This updates the examples for PhysicalKeyboardKey and LogicalKeyboardKey to use Focus widgets that handle the keys instead of using RawKeyboardListener, since that usually leads people down the wrong path. Updated the See Also and added tests as well. Also exposed the `physicalKey` attribute for `tester.sendKeyEvent`.
96 lines
2.8 KiB
Dart
96 lines
2.8 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flutter code sample for LogicalKeyboardKey
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
void main() => runApp(const KeyExampleApp());
|
|
|
|
class KeyExampleApp extends StatelessWidget {
|
|
const KeyExampleApp({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
home: Scaffold(
|
|
appBar: AppBar(title: const Text('Key Handling Example')),
|
|
body: const MyKeyExample(),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class MyKeyExample extends StatefulWidget {
|
|
const MyKeyExample({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
State<MyKeyExample> createState() => _MyKeyExampleState();
|
|
}
|
|
|
|
class _MyKeyExampleState extends State<MyKeyExample> {
|
|
// The node used to request the keyboard focus.
|
|
final FocusNode _focusNode = FocusNode();
|
|
// The message to display.
|
|
String? _message;
|
|
|
|
// Focus nodes need to be disposed.
|
|
@override
|
|
void dispose() {
|
|
_focusNode.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
// Handles the key events from the Focus widget and updates the
|
|
// _message.
|
|
KeyEventResult _handleKeyEvent(FocusNode node, RawKeyEvent event) {
|
|
setState(() {
|
|
if (event.logicalKey == LogicalKeyboardKey.keyQ) {
|
|
_message = 'Pressed the "Q" key!';
|
|
} else {
|
|
if (kReleaseMode) {
|
|
_message = 'Not a Q: Pressed 0x${event.logicalKey.keyId.toRadixString(16)}';
|
|
} else {
|
|
// As the name implies, the debugName will only print useful
|
|
// information in debug mode.
|
|
_message = 'Not a Q: Pressed ${event.logicalKey.debugName}';
|
|
}
|
|
}
|
|
});
|
|
return event.logicalKey == LogicalKeyboardKey.keyQ ? KeyEventResult.handled : KeyEventResult.ignored;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final TextTheme textTheme = Theme.of(context).textTheme;
|
|
return Container(
|
|
color: Colors.white,
|
|
alignment: Alignment.center,
|
|
child: DefaultTextStyle(
|
|
style: textTheme.headline4!,
|
|
child: Focus(
|
|
focusNode: _focusNode,
|
|
onKey: _handleKeyEvent,
|
|
child: AnimatedBuilder(
|
|
animation: _focusNode,
|
|
builder: (BuildContext context, Widget? child) {
|
|
if (!_focusNode.hasFocus) {
|
|
return GestureDetector(
|
|
onTap: () {
|
|
FocusScope.of(context).requestFocus(_focusNode);
|
|
},
|
|
child: const Text('Click to focus'),
|
|
);
|
|
}
|
|
return Text(_message ?? 'Press a key');
|
|
},
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|