Created with <3 with dartpad.dev.
Last active
December 9, 2023 14:28
-
-
Save CillianMyles/cd857c1c53403e689e86c2fa0a9cfd3d to your computer and use it in GitHub Desktop.
KeyboardVisibilityBuilder - a Flutter widget that rebuilds when the keyboard is shown or dismissed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
class KeyboardVisibilityBuilder extends StatefulWidget { | |
const KeyboardVisibilityBuilder({ | |
required this.builder, | |
this.child, | |
Key? key, | |
}) : super(key: key); | |
final Widget Function( | |
BuildContext context, | |
bool isKeyboardVisible, | |
Widget? child, | |
) builder; | |
final Widget? child; | |
@override | |
_KeyboardVisibilityBuilderState createState() => | |
_KeyboardVisibilityBuilderState(); | |
} | |
class _KeyboardVisibilityBuilderState extends State<KeyboardVisibilityBuilder> | |
with WidgetsBindingObserver { | |
late bool _isVisible; | |
@override | |
void initState() { | |
super.initState(); | |
_isVisible = WidgetsBinding.instance!.window.viewInsets.bottom > 0.0; | |
WidgetsBinding.instance!.addObserver(this); | |
} | |
@override | |
void dispose() { | |
WidgetsBinding.instance!.removeObserver(this); | |
super.dispose(); | |
} | |
@override | |
void didChangeMetrics() { | |
final isVisible = WidgetsBinding.instance!.window.viewInsets.bottom > 0.0; | |
if (isVisible != _isVisible) { | |
setState(() { | |
_isVisible = isVisible; | |
}); | |
} | |
} | |
@override | |
Widget build(BuildContext context) => widget.builder( | |
context, | |
_isVisible, | |
widget.child, | |
); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
class KeyboardVisibilityBuilder extends StatefulWidget { | |
const KeyboardVisibilityBuilder({ | |
required this.builder, | |
this.child, | |
super.key, | |
}); | |
final Widget Function( | |
BuildContext context, | |
bool isKeyboardVisible, | |
Widget? child, | |
) builder; | |
final Widget? child; | |
@override | |
State<KeyboardVisibilityBuilder> createState() => | |
_KeyboardVisibilityBuilderState(); | |
} | |
class _KeyboardVisibilityBuilderState extends State<KeyboardVisibilityBuilder> | |
with WidgetsBindingObserver { | |
late bool _isVisible; | |
@override | |
void initState() { | |
super.initState(); | |
_isVisible = MediaQuery.of(context).viewInsets.bottom > 0.0; | |
WidgetsBinding.instance.addObserver(this); | |
} | |
@override | |
void dispose() { | |
WidgetsBinding.instance.removeObserver(this); | |
super.dispose(); | |
} | |
@override | |
void didChangeMetrics() { | |
final isVisible = MediaQuery.of(context).viewInsets.bottom > 0.0; | |
if (isVisible != _isVisible) { | |
setState(() { | |
_isVisible = isVisible; | |
}); | |
} | |
} | |
@override | |
Widget build(BuildContext context) => widget.builder( | |
context, | |
_isVisible, | |
widget.child, | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment