{"id":13551321,"url":"https://github.com/MisterJimson/flutter_keyboard_visibility","last_synced_at":"2025-04-03T01:32:10.099Z","repository":{"id":40267836,"uuid":"194890585","full_name":"MisterJimson/flutter_keyboard_visibility","owner":"MisterJimson","description":"Get notified on keyboard visibility changes in your Flutter app","archived":false,"fork":false,"pushed_at":"2024-07-09T16:29:44.000Z","size":431,"stargazers_count":398,"open_issues_count":32,"forks_count":109,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-08-01T12:24:13.301Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MisterJimson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["MisterJimson"]}},"created_at":"2019-07-02T15:31:50.000Z","updated_at":"2024-07-28T23:22:41.000Z","dependencies_parsed_at":"2023-12-21T19:01:06.110Z","dependency_job_id":"17d28326-87d8-495e-bf8a-2c3decc88a14","html_url":"https://github.com/MisterJimson/flutter_keyboard_visibility","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MisterJimson%2Fflutter_keyboard_visibility","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MisterJimson%2Fflutter_keyboard_visibility/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MisterJimson%2Fflutter_keyboard_visibility/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MisterJimson%2Fflutter_keyboard_visibility/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MisterJimson","download_url":"https://codeload.github.com/MisterJimson/flutter_keyboard_visibility/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222905752,"owners_count":17055817,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T12:01:46.154Z","updated_at":"2024-11-03T21:31:50.175Z","avatar_url":"https://github.com/MisterJimson.png","language":"Dart","funding_links":["https://github.com/sponsors/MisterJimson"],"categories":["Dart"],"sub_categories":[],"readme":"# Flutter Keyboard Visibility\n[![pub package](https://img.shields.io/pub/v/flutter_keyboard_visibility.svg?label=flutter_keyboard_visibility\u0026color=blue)](https://pub.dev/packages/flutter_keyboard_visibility)\n![ci](https://github.com/MisterJimson/flutter_keyboard_visibility/actions/workflows/test.yml/badge.svg?branch=master)\n[![codecov](https://codecov.io/gh/MisterJimson/flutter_keyboard_visibility/branch/master/graph/badge.svg)](https://codecov.io/gh/MisterJimson/flutter_keyboard_visibility)\n\nReact to keyboard visibility changes.\n\n### Note about Flutter Web and Desktop support\n\nWeb support is an open issue [here](https://github.com/MisterJimson/flutter_keyboard_visibility/issues/10), desktop support is an open issue [here](https://github.com/MisterJimson/flutter_keyboard_visibility/issues/124). Currently this library will just return `false` for keyboard visibility on web and desktop.\n\n## Install\n[Install the package](https://pub.dev/packages/flutter_keyboard_visibility/install)\n## Usage: React to Keyboard Visibility Changes\n### Option 1: Within your `Widget` tree using a builder\nBuild your Widget tree based on whether or not the keyboard is visible by using `KeyboardVisibilityBuilder`.\n```dart\nimport 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';\n\n/// In any of your widgets...\n@override\nWidget build(BuildContext context) {\n  return KeyboardVisibilityBuilder(\n      builder: (context, isKeyboardVisible) {\n        return Text(\n          'The keyboard is: ${isKeyboardVisible ? 'VISIBLE' : 'NOT VISIBLE'}',\n        );\n      }\n  );\n```\n### Option 2: Within your `Widget` tree using a provider\nBuild your `Widget` tree based on whether or not the keyboard is\nvisible by including a `KeyboardVisibilityProvider` near the top\nof your tree.\n```dart\nimport 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';\n\n// Somewhere near the top of your tree...\n@override\nWidget build(BuildContext context) {\n  return KeyboardVisibilityProvider(\n    child: MyDemoPage(),\n  );\n}\n\n// Within MyDemoPage...\n@override\nWidget build(BuildContext context) {\n  final bool isKeyboardVisible = KeyboardVisibilityProvider.isKeyboardVisible(context);\n  return Text(\n    'The keyboard is: ${isKeyboardVisible ? 'VISIBLE' : 'NOT VISIBLE'}',\n  );\n}\n```\n\n### Option 3: Direct query and subscription\n\nQuery and/or subscribe to keyboard visibility directly with the\n`KeyboardVisibilityController` class.\n\n```dart\nimport 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';\nimport 'dart:async';\n\nlate StreamSubscription\u003cbool\u003e keyboardSubscription;\n\n@override\nvoid initState() {\n  super.initState();\n\n  var keyboardVisibilityController = KeyboardVisibilityController();\n  // Query\n  print('Keyboard visibility direct query: ${keyboardVisibilityController.isVisible}');\n\n  // Subscribe\n  keyboardSubscription = keyboardVisibilityController.onChange.listen((bool visible) {\n    print('Keyboard visibility update. Is visible: $visible');\n  });\n}\n\n@override\nvoid dispose() {\n  keyboardSubscription.cancel();\n  super.dispose();\n}\n```\n## Usage: Dismiss keyboard on tap\nPlace a `KeyboardDismissOnTap` near the top of your `Widget` tree. When a user taps outside of the currently focused `Widget`, the `Widget` will drop focus and the keyboard will be dismissed.\n```dart\nimport 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';\n\n// Somewhere near the top of your tree...\n@override\nWidget build(BuildContext context) {\n  return KeyboardDismissOnTap(\n    child: MyDemoPage(),\n  );\n}\n```\nBy default `KeyboardDismissOnTap` will only dismiss taps not captured by other interactive `Widget`s, like buttons. If you would like to dismiss the keyboard for any tap, including taps on interactive `Widget`s, set `dismissOnCapturedTaps` to true.\n```dart\nimport 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';\n\n// Somewhere near the top of your tree...\n@override\nWidget build(BuildContext context) {\n  return KeyboardDismissOnTap(\n    dismissOnCapturedTaps: true,\n    child: MyDemoPage(),\n  );\n}\n```\nThe `IgnoreKeyboardDismiss` `Widget` can be used to further refine which taps do and do not dismiss the keyboard. Checkout the example app for more detail.\n## Testing\n### Testing using mocks\n`KeyboardVisibilityProvider` and `KeyboardVisibilityBuilder` accept a `controller` parameter that allow you to mock or replace the logic for reporting keyboard visibility updates.\n```dart\n@GenerateMocks([KeyboardVisibilityController])\nvoid main() {\n  testWidgets('It reports true when the keyboard is visible', (WidgetTester tester) async {\n    // Pretend that the keyboard is visible.\n    var mockController = MockKeyboardVisibilityController();\n    when(mockController.onChange)\n        .thenAnswer((_) =\u003e Stream.fromIterable([true]));\n    when(mockController.isVisible).thenAnswer((_) =\u003e true);\n\n    // Build a Widget tree and query KeyboardVisibilityProvider\n    // for the visibility of the keyboard.\n    bool? isKeyboardVisible;\n\n    await tester.pumpWidget(\n      KeyboardVisibilityProvider(\n        controller: mockController,\n        child: Builder(\n          builder: (BuildContext context) {\n            isKeyboardVisible =\n                KeyboardVisibilityProvider.isKeyboardVisible(context);\n            return SizedBox();\n          },\n        ),\n      ),\n    );\n\n    // Verify that KeyboardVisibilityProvider reported that the\n    // keyboard is visible.\n    expect(isKeyboardVisible, true);\n  });\n}\n```\n### Testing with a global override \nCall `KeyboardVisibilityTesting.setVisibilityForTesting(false);` to set a custom value to use during `flutter test`. This is set globally and will override the standard logic of the native platform.\n```dart\nvoid main() {\n  testWidgets('My Test', (WidgetTester tester) async {\n    KeyboardVisibilityTesting.setVisibilityForTesting(true);\n    await tester.pumpWidget(MyApp());\n  });\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMisterJimson%2Fflutter_keyboard_visibility","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMisterJimson%2Fflutter_keyboard_visibility","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMisterJimson%2Fflutter_keyboard_visibility/lists"}