// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(new MaterialApp( title: 'Hardware Key Demo', home: new Scaffold( appBar: new AppBar( title: const Text('Hardware Key Demo'), ), body: const Center( child: const RawKeyboardDemo(), ), ), )); } class RawKeyboardDemo extends StatefulWidget { const RawKeyboardDemo({ Key key }) : super(key: key); @override _HardwareKeyDemoState createState() => new _HardwareKeyDemoState(); } class _HardwareKeyDemoState extends State { final FocusNode _focusNode = new FocusNode(); RawKeyEvent _event; @override void dispose() { _focusNode.dispose(); super.dispose(); } void _handleKeyEvent(RawKeyEvent event) { setState(() { _event = event; }); } @override Widget build(BuildContext context) { final TextTheme textTheme = Theme.of(context).textTheme; return new RawKeyboardListener( focusNode: _focusNode, onKey: _handleKeyEvent, child: new AnimatedBuilder( animation: _focusNode, builder: (BuildContext context, Widget child) { if (!_focusNode.hasFocus) { return new GestureDetector( onTap: () { FocusScope.of(context).requestFocus(_focusNode); }, child: new Text('Tap to focus', style: textTheme.display1), ); } if (_event == null) return new Text('Press a key', style: textTheme.display1); int codePoint; int keyCode; int hidUsage; final RawKeyEventData data = _event.data; if (data is RawKeyEventDataAndroid) { codePoint = data.codePoint; keyCode = data.keyCode; } else if (data is RawKeyEventDataFuchsia) { codePoint = data.codePoint; hidUsage = data.hidUsage; } return new Column( mainAxisAlignment: MainAxisAlignment.center, children: [ new Text('${_event.runtimeType}', style: textTheme.body2), new Text('codePoint: $codePoint', style: textTheme.display4), new Text('keyCode: $keyCode', style: textTheme.display4), new Text('hidUsage: $hidUsage', style: textTheme.display4), ], ); }, ), ); } }