Skip to content

Commit 5163b34

Browse files
authored
4.0.0 (#47)
* move away from statics * docs * use handler * update tests * tests update * publish interface * publish web * updated docs * docs for platform interface * Documentation updates for web * bump * minor * minor * update readme * update
1 parent 250db23 commit 5163b34

24 files changed

+353
-79
lines changed

README.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ React to keyboard visibility changes.
77
Add the dependency to your pubspec.yaml
88
```yaml
99
dependencies:
10-
flutter_keyboard_visibility: ^3.3.0
10+
flutter_keyboard_visibility: ^4.0.0
1111
```
1212
## Usage: React to Keyboard Visibility Changes
1313
### Option 1: Within your `Widget` tree using a builder
@@ -54,19 +54,21 @@ Widget build(BuildContext context) {
5454
### Option 3: Direct query and subscription
5555

5656
Query and/or subscribe to keyboard visibility directly with the
57-
`KeyboardVisibility` class.
57+
`KeyboardVisibilityController` class.
5858

5959
```dart
6060
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
6161
6262
@override
6363
void initState() {
6464
super.initState();
65+
66+
var keyboardVisibilityController = KeyboardVisibilityController();
6567
// Query
66-
print('Keyboard visibility direct query: ${KeyboardVisibility.isVisible}');
68+
print('Keyboard visibility direct query: ${keyboardVisibilityController.isVisible}');
6769
6870
// Subscribe
69-
KeyboardVisibility.onChange.listen((bool visible) {
71+
keyboardVisibilityController.listen((bool visible) {
7072
print('Keyboard visibility update. Is visible: ${visible}');
7173
});
7274
}

flutter_keyboard_visibility/CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
## [4.0.1] - November 23, 2020
2+
3+
* Update documentation
4+
5+
## [4.0.0] - November 23, 2020
6+
7+
* Federated the plugin to better support more platforms going forward
8+
* Refactored internal implementation
9+
* Deprecated KeyboardVisibility static access, will be removed in a future release
10+
* Added KeyboardVisibilityController as a new way to access keyboard visibility
11+
* KeyboardVisibilityBuilder & KeyboardVisibilityProvider now have `controller` parameters that allow
12+
you to pass a mock implementation of KeyboardVisibilityController for testing.
13+
114
## [3.3.0] - November 6, 2020
215

316
Thanks to lukepighetti for this feature

flutter_keyboard_visibility/README.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ React to keyboard visibility changes.
77
Add the dependency to your pubspec.yaml
88
```yaml
99
dependencies:
10-
flutter_keyboard_visibility: ^3.3.0
10+
flutter_keyboard_visibility: ^4.0.0
1111
```
1212
## Usage: React to Keyboard Visibility Changes
1313
### Option 1: Within your `Widget` tree using a builder
@@ -53,20 +53,22 @@ Widget build(BuildContext context) {
5353

5454
### Option 3: Direct query and subscription
5555

56-
Query and/or subscribe to keyboard visibility directly with the
57-
`KeyboardVisibility` class.
56+
Query and/or subscribe to keyboard visibility directly with the
57+
`KeyboardVisibilityController` class.
5858

5959
```dart
6060
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
6161
6262
@override
6363
void initState() {
6464
super.initState();
65+
66+
var keyboardVisibilityController = KeyboardVisibilityController();
6567
// Query
66-
print('Keyboard visibility direct query: ${KeyboardVisibility.isVisible}');
67-
68+
print('Keyboard visibility direct query: ${keyboardVisibilityController.isVisible}');
69+
6870
// Subscribe
69-
KeyboardVisibility.onChange.listen((bool visible) {
71+
keyboardVisibilityController.listen((bool visible) {
7072
print('Keyboard visibility update. Is visible: ${visible}');
7173
});
7274
}

flutter_keyboard_visibility/example/test/widget_test.dart

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import 'package:flutter_test/flutter_test.dart';
33

44
import 'package:flutter_keyboard_visibility_example/main.dart';
55

6+
// ignore_for_file: deprecated_member_use
7+
68
/// If [KeyboardVisibility.setVisibilityForTesting] is set we should not see
79
/// a MissingPluginException logged
810
void main() {

flutter_keyboard_visibility/example_old/test/widget_test.dart

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import 'package:flutter_test/flutter_test.dart';
33

44
import 'package:example_old/main.dart';
55

6+
// ignore_for_file: deprecated_member_use
7+
68
/// If [KeyboardVisibility.setVisibilityForTesting] is set we should not see
79
/// a MissingPluginException logged
810
void main() {
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
library flutter_keyboard_visibility;
22

33
export 'package:flutter_keyboard_visibility/src/keyboard_visibility.dart';
4+
export 'package:flutter_keyboard_visibility/src/keyboard_visibility_controller.dart';
45
export 'package:flutter_keyboard_visibility/src/ui/keyboard_visibility_provider.dart';
56
export 'package:flutter_keyboard_visibility/src/ui/keyboard_visibility_builder.dart';
67
export 'package:flutter_keyboard_visibility/src/ui/keyboard_dismiss_on_tap.dart';
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,34 @@
11
import 'dart:async';
2+
import 'package:flutter_keyboard_visibility/src/keyboard_visibility_handler.dart';
23
import 'package:meta/meta.dart';
3-
import 'package:flutter_keyboard_visibility_platform_interface/flutter_keyboard_visibility_platform_interface.dart';
44

55
/// Provides access to the current keyboard visibility state and emits
66
/// changes as they happen.
7+
@Deprecated(
8+
'Use KeyboardVisibilityController instead. Will be removed in a future release.')
79
class KeyboardVisibility {
810
KeyboardVisibility._();
911

10-
static FlutterKeyboardVisibilityPlatform get _platform =>
11-
FlutterKeyboardVisibilityPlatform.instance;
12-
13-
static bool _isInitialized = false;
14-
static final _onChangeController = StreamController<bool>();
15-
static final _onChange = _onChangeController.stream.asBroadcastStream();
16-
1712
/// Emits true every time the keyboard is shown, and false every time the
1813
/// keyboard is dismissed.
19-
static Stream<bool> get onChange {
20-
// If _testIsVisible set, don't try to create the EventChannel
21-
if (!_isInitialized && _testIsVisible == null) {
22-
_platform.onChange.listen(_updateValue);
23-
_isInitialized = true;
24-
}
25-
return _onChange;
26-
}
14+
@Deprecated(
15+
'Use KeyboardVisibilityController instead. Will be removed in a future release.')
16+
static Stream<bool> get onChange => KeyboardVisibilityHandler.onChange;
2717

2818
/// Returns true if the keyboard is currently visible, false if not.
29-
static bool get isVisible => _testIsVisible ?? _isVisible;
30-
static bool _isVisible = false;
31-
32-
/// Fake representation of whether or not the keyboard is visible
33-
/// for testing purposes. When this value is non-null, it will be
34-
/// reported exclusively by the `isVisible` getter.
35-
static bool _testIsVisible;
19+
@Deprecated(
20+
'Use KeyboardVisibilityController instead. Will be removed in a future release.')
21+
static bool get isVisible => KeyboardVisibilityHandler.isVisible;
3622

3723
/// Forces `KeyboardVisibility` to report `isKeyboardVisible`
3824
/// for testing purposes.
3925
///
4026
/// `KeyboardVisibility` will continue reporting `isKeyboardVisible`
4127
/// until the value is changed again with this method. To stop
4228
/// using fake values altogether, set `isKeyboardVisible` to null.
29+
@Deprecated(
30+
'Mock KeyboardVisibilityController instead. Will be removed in a future release.')
4331
@visibleForTesting
44-
static void setVisibilityForTesting(bool isKeyboardVisible) {
45-
_updateValue(isKeyboardVisible);
46-
}
47-
48-
static void _updateValue(bool newValue) {
49-
_isVisible = newValue;
50-
_testIsVisible = newValue;
51-
_onChangeController.add(newValue);
52-
}
32+
static void setVisibilityForTesting(bool isKeyboardVisible) =>
33+
KeyboardVisibilityHandler.setVisibilityForTesting(isKeyboardVisible);
5334
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:flutter_keyboard_visibility/src/keyboard_visibility_handler.dart';
2+
3+
/// Provides direct information about keyboard visibility and allows you
4+
/// to subscribe to changes.
5+
class KeyboardVisibilityController {
6+
/// Constructs a singleton instance of [KeyboardVisibilityController].
7+
///
8+
/// [KeyboardVisibilityController] is designed to work as a singleton.
9+
// When a second instance is created, the first instance will not be able to listen to the
10+
// EventChannel because it is overridden. Forcing the class to be a singleton class can prevent
11+
// misuse of creating a second instance from a programmer.
12+
factory KeyboardVisibilityController() {
13+
_instance ??= KeyboardVisibilityController._();
14+
return _instance;
15+
}
16+
17+
KeyboardVisibilityController._();
18+
19+
static KeyboardVisibilityController _instance;
20+
21+
Stream<bool> get onChange => KeyboardVisibilityHandler.onChange;
22+
23+
bool get isVisible => KeyboardVisibilityHandler.isVisible;
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import 'dart:async';
2+
import 'package:flutter_keyboard_visibility_platform_interface/flutter_keyboard_visibility_platform_interface.dart';
3+
4+
/// Provides access to the current keyboard visibility state and emits
5+
/// changes as they happen. For internal use only.
6+
class KeyboardVisibilityHandler {
7+
KeyboardVisibilityHandler._();
8+
9+
static FlutterKeyboardVisibilityPlatform get _platform =>
10+
FlutterKeyboardVisibilityPlatform.instance;
11+
12+
static bool _isInitialized = false;
13+
static final _onChangeController = StreamController<bool>();
14+
static final _onChange = _onChangeController.stream.asBroadcastStream();
15+
16+
/// Emits true every time the keyboard is shown, and false every time the
17+
/// keyboard is dismissed.
18+
static Stream<bool> get onChange {
19+
// If _testIsVisible set, don't try to create the EventChannel
20+
if (!_isInitialized && _testIsVisible == null) {
21+
_platform.onChange.listen(_updateValue);
22+
_isInitialized = true;
23+
}
24+
return _onChange;
25+
}
26+
27+
/// Returns true if the keyboard is currently visible, false if not.
28+
static bool get isVisible => _testIsVisible ?? _isVisible;
29+
static bool _isVisible = false;
30+
31+
/// Fake representation of whether or not the keyboard is visible
32+
/// for testing purposes. When this value is non-null, it will be
33+
/// reported exclusively by the `isVisible` getter.
34+
static bool _testIsVisible;
35+
36+
/// Forces `KeyboardVisibility` to report `isKeyboardVisible`
37+
/// for testing purposes.
38+
///
39+
/// `KeyboardVisibility` will continue reporting `isKeyboardVisible`
40+
/// until the value is changed again with this method. To stop
41+
/// using fake values altogether, set `isKeyboardVisible` to null.
42+
static void setVisibilityForTesting(bool isKeyboardVisible) {
43+
_updateValue(isKeyboardVisible);
44+
}
45+
46+
static void _updateValue(bool newValue) {
47+
_isVisible = newValue;
48+
_testIsVisible = newValue;
49+
_onChangeController.add(newValue);
50+
}
51+
}

flutter_keyboard_visibility/lib/src/ui/keyboard_visibility_builder.dart

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
import 'package:flutter/widgets.dart';
2-
import 'package:flutter_keyboard_visibility/src/keyboard_visibility.dart';
2+
import 'package:flutter_keyboard_visibility/src/keyboard_visibility_controller.dart';
33

44
/// A convenience builder that exposes if the native keyboard is visible.
55
class KeyboardVisibilityBuilder extends StatelessWidget {
6-
const KeyboardVisibilityBuilder({Key key, this.builder}) : super(key: key);
6+
/// Optional: pass in a controller you already have created. This is useful
7+
/// for testing, as you can pass in a mock instance. If no controller is
8+
/// passed in, one will be created automatically.
9+
final KeyboardVisibilityController controller;
10+
11+
KeyboardVisibilityController get _controller =>
12+
controller ?? KeyboardVisibilityController();
13+
14+
const KeyboardVisibilityBuilder({Key key, this.builder, this.controller})
15+
: super(key: key);
716

817
/// A builder method that exposes if the native keyboard is visible.
918
final Widget Function(BuildContext, bool isKeyboardVisible) builder;
1019

1120
@override
1221
Widget build(BuildContext context) {
1322
return StreamBuilder<bool>(
14-
stream: KeyboardVisibility.onChange,
15-
initialData: KeyboardVisibility.isVisible,
23+
stream: _controller.onChange,
24+
initialData: _controller.isVisible,
1625
builder: (context, snapshot) {
1726
final isKeyboardVisible = snapshot.data;
1827

flutter_keyboard_visibility/lib/src/ui/keyboard_visibility_provider.dart

+20-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'dart:async';
22
import 'package:flutter/widgets.dart';
3-
import 'package:flutter_keyboard_visibility/src/keyboard_visibility.dart';
3+
import 'package:flutter_keyboard_visibility/src/keyboard_visibility_controller.dart';
44

55
/// Widget that reports to its descendants whether or not
66
/// the keyboard is currently visible.
@@ -16,14 +16,30 @@ import 'package:flutter_keyboard_visibility/src/keyboard_visibility.dart';
1616
/// return KeyboardVisibilityProvider(
1717
/// child: Builder(
1818
/// builder: (BuildContext context) {
19-
/// final bool isKeyboardVisible = KeyboarVisibilityProvider.isKeyboardVisible(context);
19+
/// final bool isKeyboardVisible = KeyboardVisibilityProvider.isKeyboardVisible(context);
2020
///
2121
/// return Text('Keyboard is visible: $isKeyboardVisible');
2222
/// },
2323
/// ),
2424
/// );
2525
/// ```
2626
class KeyboardVisibilityProvider extends StatefulWidget {
27+
final Widget child;
28+
29+
/// Optional: pass in a controller you already have created. This is useful
30+
/// for testing, as you can pass in a mock instance. If no controller is
31+
/// passed in, one will be created automatically.
32+
final KeyboardVisibilityController controller;
33+
34+
KeyboardVisibilityController get _controller =>
35+
controller ?? KeyboardVisibilityController();
36+
37+
const KeyboardVisibilityProvider({
38+
Key key,
39+
this.child,
40+
this.controller,
41+
}) : super(key: key);
42+
2743
/// Returns `true` if the keyboard is currently visible, `false`
2844
/// if the keyboard is not currently visible, or `null` if
2945
/// the `flutter_keyboard_visibility` plugin does not yet
@@ -39,13 +55,6 @@ class KeyboardVisibilityProvider extends StatefulWidget {
3955
.isKeyboardVisible;
4056
}
4157

42-
const KeyboardVisibilityProvider({
43-
Key key,
44-
this.child,
45-
}) : super(key: key);
46-
47-
final Widget child;
48-
4958
@override
5059
_KeyboardVisibilityProviderState createState() =>
5160
_KeyboardVisibilityProviderState();
@@ -59,9 +68,9 @@ class _KeyboardVisibilityProviderState
5968
@override
6069
void initState() {
6170
super.initState();
62-
_isKeyboardVisible = KeyboardVisibility.isVisible;
71+
_isKeyboardVisible = widget._controller.isVisible;
6372
_subscription =
64-
KeyboardVisibility.onChange.listen(_onKeyboardVisibilityChange);
73+
widget._controller.onChange.listen(_onKeyboardVisibilityChange);
6574
}
6675

6776
void _onKeyboardVisibilityChange(bool isKeyboardVisible) {

flutter_keyboard_visibility/pubspec.yaml

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
name: flutter_keyboard_visibility
22
description: Flutter plugin for discovering the state of the soft-keyboard visibility on Android and iOS.
3-
version: 4.0.0
3+
version: 4.0.1
44
homepage: https://github.com/MisterJimson/flutter_keyboard_visibility
5+
repository: https://github.com/MisterJimson/flutter_keyboard_visibility
56

67
environment:
78
sdk: ">=2.1.0 <3.0.0"
8-
flutter: ">=1.12.13+hotfix.6"
9+
flutter: ">=1.20.0"
910

1011
dependencies:
11-
meta: any
12-
flutter_keyboard_visibility_platform_interface:
13-
path: ../flutter_keyboard_visibility_platform_interface
14-
flutter_keyboard_visibility_web:
15-
path: ../flutter_keyboard_visibility_web
12+
meta: ">=1.0.0 <2.0.0"
13+
flutter_keyboard_visibility_platform_interface: ^1.0.1
14+
flutter_keyboard_visibility_web: ^1.0.1
1615
flutter:
1716
sdk: flutter
1817

1918
dev_dependencies:
19+
mockito: ^4.1.3
2020
pedantic: 1.9.0
2121
flutter_test:
2222
sdk: flutter

0 commit comments

Comments
 (0)