diff --git a/flutter_keyboard_visibility_web/lib/flutter_keyboard_visibility_web.dart b/flutter_keyboard_visibility_web/lib/flutter_keyboard_visibility_web.dart index e3f6ffb..7ddb295 100644 --- a/flutter_keyboard_visibility_web/lib/flutter_keyboard_visibility_web.dart +++ b/flutter_keyboard_visibility_web/lib/flutter_keyboard_visibility_web.dart @@ -1,25 +1,46 @@ -import 'dart:html' as html show window, Navigator; +import 'dart:async'; +import 'package:web/web.dart'; import 'package:flutter_keyboard_visibility_platform_interface/flutter_keyboard_visibility_platform_interface.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; /// The web implementation of the [FlutterKeyboardVisibilityPlatform] of the /// FlutterKeyboardVisibility plugin. -class FlutterKeyboardVisibilityPluginWeb - extends FlutterKeyboardVisibilityPlatform { +class FlutterKeyboardVisibilityPluginWeb extends FlutterKeyboardVisibilityPlatform { /// Constructs a [FlutterKeyboardVisibilityPluginWeb]. - FlutterKeyboardVisibilityPluginWeb(html.Navigator navigator); + FlutterKeyboardVisibilityPluginWeb(Navigator navigator); + + static final _onChangeController = StreamController(); + static final _onChange = _onChangeController.stream.asBroadcastStream(); /// Factory method that initializes the FlutterKeyboardVisibility plugin /// platform with an instance of the plugin for the web. static void registerWith(Registrar registrar) { - FlutterKeyboardVisibilityPlatform.instance = - FlutterKeyboardVisibilityPluginWeb(html.window.navigator); + FlutterKeyboardVisibilityPlatform.instance = FlutterKeyboardVisibilityPluginWeb(window.navigator); + EventStreamProvider('resize').forTarget(window.visualViewport).listen((e) { + final minKeyboardHeight = 200; + + final screenHeight = window.screen.height; + final viewportHeight = window.visualViewport?.height.toInt() ?? 0; + final newState = (screenHeight - minKeyboardHeight) > viewportHeight; + _updateValue(newState); + }); + } + + static bool get isVisible => _isVisible; + static bool _isVisible = false; + + static void _updateValue(bool newValue) { + // Don't report the same value multiple times + if (newValue == _isVisible) { + return; + } + + _isVisible = newValue; + _onChangeController.add(newValue); } /// Emits changes to keyboard visibility from the platform. Web is not /// implemented yet so false is returned. @override - Stream get onChange async* { - yield false; - } + Stream get onChange => _onChange; } diff --git a/flutter_keyboard_visibility_web/pubspec.yaml b/flutter_keyboard_visibility_web/pubspec.yaml index 88ea30a..ff3e66a 100644 --- a/flutter_keyboard_visibility_web/pubspec.yaml +++ b/flutter_keyboard_visibility_web/pubspec.yaml @@ -1,11 +1,11 @@ name: flutter_keyboard_visibility_web description: An implementation for the web platform of `flutter_keyboard_visibility' -version: 2.0.0 +version: 2.0.1 homepage: https://github.com/MisterJimson/flutter_keyboard_visibility repository: https://github.com/MisterJimson/flutter_keyboard_visibility environment: - sdk: '>=2.12.0 <4.0.0' + sdk: ">=2.12.0 <4.0.0" flutter: ">=1.20.0" flutter: @@ -17,12 +17,13 @@ flutter: dependencies: flutter_keyboard_visibility_platform_interface: ^2.0.0 + web: ">=0.5.0 <2.0.0" flutter_web_plugins: sdk: flutter flutter: sdk: flutter dev_dependencies: - pedantic: ^1.11.0 + pedantic: ^1.11.1 flutter_test: - sdk: flutter \ No newline at end of file + sdk: flutter