|
1 | | -import 'dart:html' as html show window, Navigator; |
| 1 | +import 'dart:async'; |
| 2 | +import 'package:web/web.dart'; |
2 | 3 | import 'package:flutter_keyboard_visibility_platform_interface/flutter_keyboard_visibility_platform_interface.dart'; |
3 | 4 | import 'package:flutter_web_plugins/flutter_web_plugins.dart'; |
4 | 5 |
|
5 | 6 | /// The web implementation of the [FlutterKeyboardVisibilityPlatform] of the |
6 | 7 | /// FlutterKeyboardVisibility plugin. |
7 | | -class FlutterKeyboardVisibilityPluginWeb |
8 | | - extends FlutterKeyboardVisibilityPlatform { |
| 8 | +class FlutterKeyboardVisibilityPluginWeb extends FlutterKeyboardVisibilityPlatform { |
9 | 9 | /// Constructs a [FlutterKeyboardVisibilityPluginWeb]. |
10 | | - FlutterKeyboardVisibilityPluginWeb(html.Navigator navigator); |
| 10 | + FlutterKeyboardVisibilityPluginWeb(Navigator navigator); |
| 11 | + |
| 12 | + static final _onChangeController = StreamController<bool>(); |
| 13 | + static final _onChange = _onChangeController.stream.asBroadcastStream(); |
11 | 14 |
|
12 | 15 | /// Factory method that initializes the FlutterKeyboardVisibility plugin |
13 | 16 | /// platform with an instance of the plugin for the web. |
14 | 17 | static void registerWith(Registrar registrar) { |
15 | | - FlutterKeyboardVisibilityPlatform.instance = |
16 | | - FlutterKeyboardVisibilityPluginWeb(html.window.navigator); |
| 18 | + FlutterKeyboardVisibilityPlatform.instance = FlutterKeyboardVisibilityPluginWeb(window.navigator); |
| 19 | + EventStreamProvider<Event>('resize').forTarget(window.visualViewport).listen((e) { |
| 20 | + final minKeyboardHeight = 200; |
| 21 | + |
| 22 | + final screenHeight = window.screen.height; |
| 23 | + final viewportHeight = window.visualViewport?.height.toInt() ?? 0; |
| 24 | + final newState = (screenHeight - minKeyboardHeight) > viewportHeight; |
| 25 | + _updateValue(newState); |
| 26 | + }); |
| 27 | + } |
| 28 | + |
| 29 | + static bool get isVisible => _isVisible; |
| 30 | + static bool _isVisible = false; |
| 31 | + |
| 32 | + static void _updateValue(bool newValue) { |
| 33 | + // Don't report the same value multiple times |
| 34 | + if (newValue == _isVisible) { |
| 35 | + return; |
| 36 | + } |
| 37 | + |
| 38 | + _isVisible = newValue; |
| 39 | + _onChangeController.add(newValue); |
17 | 40 | } |
18 | 41 |
|
19 | 42 | /// Emits changes to keyboard visibility from the platform. Web is not |
20 | 43 | /// implemented yet so false is returned. |
21 | 44 | @override |
22 | | - Stream<bool> get onChange async* { |
23 | | - yield false; |
24 | | - } |
| 45 | + Stream<bool> get onChange => _onChange; |
25 | 46 | } |
0 commit comments