From 12507d1bddebf2bafffea5632d6500b47c476d72 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 2 Feb 2016 13:31:54 -0800 Subject: [PATCH] RawKeyboardListener asserts if disposed without keyboard We need to check whether we're attached to the keyboard before trying to detach from the keyboard. --- .../src/widgets/raw_keyboard_listener.dart | 20 +++++++++---------- .../widget/raw_keyboard_listener_test.dart | 16 +++++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 packages/flutter/test/widget/raw_keyboard_listener_test.dart diff --git a/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart b/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart index 9048c751ee7..59344afbeaf 100644 --- a/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart +++ b/packages/flutter/lib/src/widgets/raw_keyboard_listener.dart @@ -39,19 +39,20 @@ class _RawKeyboardListenerState extends State implements mo } void dispose() { - _detachKeyboard(); + _detachKeyboardIfAttached(); super.dispose(); } void _attachOrDetachKeyboard() { - if (config.focused && _stub == null) - _attachKeyboard(); - else if (!config.focused && _stub != null) - _detachKeyboard(); + if (config.focused) + _attachKeyboardIfDetached(); + else + _detachKeyboardIfAttached(); } - void _attachKeyboard() { - assert(_stub == null); + void _attachKeyboardIfDetached() { + if (_stub != null) + return; _stub = new mojom.RawKeyboardListenerStub.unbound()..impl = this; mojom.RawKeyboardServiceProxy keyboard = new mojom.RawKeyboardServiceProxy.unbound(); shell.connectToService(null, keyboard); @@ -59,9 +60,8 @@ class _RawKeyboardListenerState extends State implements mo keyboard.close(); } - void _detachKeyboard() { - assert(_stub != null); - _stub.close(); + void _detachKeyboardIfAttached() { + _stub?.close(); _stub = null; } diff --git a/packages/flutter/test/widget/raw_keyboard_listener_test.dart b/packages/flutter/test/widget/raw_keyboard_listener_test.dart new file mode 100644 index 00000000000..b0a05e10ef8 --- /dev/null +++ b/packages/flutter/test/widget/raw_keyboard_listener_test.dart @@ -0,0 +1,16 @@ +// 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_test/flutter_test.dart'; +import 'package:flutter/widgets.dart'; +import 'package:test/test.dart'; + +void main() { + test('Can dispose without keyboard', () { + testWidgets((WidgetTester tester) { + tester.pumpWidget(new RawKeyboardListener(child: new Container())); + tester.pumpWidget(new Container()); + }); + }); +}