出现屏幕键盘时隐藏 FAB
Hide FAB when onscreen keyboard appear
在Flutter中,如何让FAB button出现屏幕键盘时隐藏?
FAB 按钮在屏幕键盘上显示时会覆盖其他元素。
您可以通过使用 viewInsets
检查键盘可见性并根据它隐藏 fab 来实现它。
示例:
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: "Example",
home: new FabHideOnKeyboard(),
));
}
class FabHideOnKeyboard extends StatefulWidget {
@override
_FabHideOnKeyboardState createState() => new _FabHideOnKeyboardState();
}
class _FabHideOnKeyboardState extends State<FabHideOnKeyboard> {
@override
Widget build(BuildContext context) {
final bool showFab = MediaQuery.of(context).viewInsets.bottom==0.0;
return Scaffold(
resizeToAvoidBottomPadding: true,
body:Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("TextField:"),
TextField()
],
),
),
floatingActionButton: showFab?Icon(Icons.add):null,
);
}
}
用 Visibility
小部件包装您的 FloatingActionButton
并用 bool
值控制可见性。
片段:
Widget build(context) {
bool keyboardIsOpen = MediaQuery.of(context).viewInsets.bottom != 0;
return Scaffold(
body: // ...
floatingActionButton: Visibility(
visible: !keyboardIsOpen,
child: // your FloatingActionButton
),
);
}
此解决方案还消除了按钮消失和出现时的动画。
确保 class extends StatefulWidget
并且您已经为它创建了一个状态
为了将来参考,这是一个遵循 https://github.com/flutter/flutter/issues/26100 基本思想的实现,但使用现有的 mixin 来减少怪癖和代码:
class FixedCenterDockedFabLocation extends StandardFabLocation
with FabCenterOffsetX, FabDockedOffsetY {
const FixedCenterDockedFabLocation();
@override
String toString() => 'FloatingActionButtonLocation.fixedCenterDocked';
@override
double getOffsetY(
ScaffoldPrelayoutGeometry scaffoldGeometry, double adjustment) {
final double contentBottom = scaffoldGeometry.contentBottom;
final double bottomMinInset = scaffoldGeometry.minInsets.bottom;
if (bottomMinInset > 0) {
// Hide if there's a keyboard
return contentBottom;
}
return super.getOffsetY(scaffoldGeometry, adjustment);
}
}
然后您可以像 floatingActionButtonLocation: const FixedCenterDockedFabLocation(),
一样简单地使用它(不要忘记 const ;))。
请随意使用此代码,不受限制或注明出处。
希望这就是您要找的
Scaffold(resizeToAvoidBottomInset: false)
Widget build(context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: // ...
body: // ...
floatingActionButton: Visibility(
child: // your FloatingActionButton
),
);
}
在Flutter中,如何让FAB button出现屏幕键盘时隐藏?
FAB 按钮在屏幕键盘上显示时会覆盖其他元素。
您可以通过使用 viewInsets
检查键盘可见性并根据它隐藏 fab 来实现它。
示例:
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: "Example",
home: new FabHideOnKeyboard(),
));
}
class FabHideOnKeyboard extends StatefulWidget {
@override
_FabHideOnKeyboardState createState() => new _FabHideOnKeyboardState();
}
class _FabHideOnKeyboardState extends State<FabHideOnKeyboard> {
@override
Widget build(BuildContext context) {
final bool showFab = MediaQuery.of(context).viewInsets.bottom==0.0;
return Scaffold(
resizeToAvoidBottomPadding: true,
body:Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("TextField:"),
TextField()
],
),
),
floatingActionButton: showFab?Icon(Icons.add):null,
);
}
}
用 Visibility
小部件包装您的 FloatingActionButton
并用 bool
值控制可见性。
Widget build(context) {
bool keyboardIsOpen = MediaQuery.of(context).viewInsets.bottom != 0;
return Scaffold(
body: // ...
floatingActionButton: Visibility(
visible: !keyboardIsOpen,
child: // your FloatingActionButton
),
);
}
此解决方案还消除了按钮消失和出现时的动画。
确保 class extends StatefulWidget
并且您已经为它创建了一个状态
为了将来参考,这是一个遵循 https://github.com/flutter/flutter/issues/26100 基本思想的实现,但使用现有的 mixin 来减少怪癖和代码:
class FixedCenterDockedFabLocation extends StandardFabLocation
with FabCenterOffsetX, FabDockedOffsetY {
const FixedCenterDockedFabLocation();
@override
String toString() => 'FloatingActionButtonLocation.fixedCenterDocked';
@override
double getOffsetY(
ScaffoldPrelayoutGeometry scaffoldGeometry, double adjustment) {
final double contentBottom = scaffoldGeometry.contentBottom;
final double bottomMinInset = scaffoldGeometry.minInsets.bottom;
if (bottomMinInset > 0) {
// Hide if there's a keyboard
return contentBottom;
}
return super.getOffsetY(scaffoldGeometry, adjustment);
}
}
然后您可以像 floatingActionButtonLocation: const FixedCenterDockedFabLocation(),
一样简单地使用它(不要忘记 const ;))。
请随意使用此代码,不受限制或注明出处。
希望这就是您要找的
Scaffold(resizeToAvoidBottomInset: false)
Widget build(context) {
return Scaffold(
resizeToAvoidBottomInset: false,
appBar: // ...
body: // ...
floatingActionButton: Visibility(
child: // your FloatingActionButton
),
);
}