[英]Hide/Dismiss keyboard on ListView scroll in Flutter app
我在 Flutter 應用中有聊天窗口。 消息在ListView
小部件內顯示為小部件,我還有附加到窗口底部的消息輸入小部件。
我想要
ListView
時隱藏鍵盤InputWidget
添加新消息時滾動到最后一條消息代碼:
class _MessagesPageState extends State<MessagesPage> {
final ScrollController listScrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
....
body: Stack(
children: [
ListView.builder(
controller: listScrollController
....
),
InputWidget()]
);
}
class InputWidget extends StatelessWidget {
final TextEditingController _textEditingController = TextEditingController();
....
Row (
children: [
TextField(
controller: _textEditingController
),
IconButton(icon: ...., onPressed: (){})
]
)}
要在列表視圖滾動時隱藏鍵盤,您只需向其添加keyboardDismissBehavior 。 例子
ListView(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
children: [],
)
至於你的第 1 點問題:
您可以為listScrollController
創建一個偵聽器函數, listScrollController
包含對匿名FocusNode
的調用(想法取自此高度投票的答案),並且當發生任何滾動事件時,焦點將從您的TextField
獲取,並且鍵盤將被解除:
class _MessagesPageState extends State<MessagesPage> {
final ScrollController listScrollController = ScrollController();
@override
void initState() {
listScrollController.addListener(_scrollListener);
super.initState();
}
_scrollListener() {
FocusScope.of(context).requestFocus(FocusNode());
}
@override
Widget build(BuildContext context) {
return Scaffold(
....
body: Stack(
children: [
ListView.builder(
controller: listScrollController
....
),
InputWidget(controller: listScrollController)]
);
}
第 2 點:
您會注意到我修改了InputWidget
以將ScrollController
作為參數,因此您可以將ListView
控制器傳遞給它。 而當IconButton
被按下時, listScrollController
會根據您的需要跳轉到最后。
class InputWidget extends StatelessWidget {
InputWidget({Key key,this.controller}) : super(key: key);
final ScrollController controller ;
final TextEditingController _textEditingController = TextEditingController();
....
Row (
children: [
TextField(
controller: _textEditingController
),
IconButton(icon: ...., onPressed: (){
controller.jumpTo(controller.position.maxScrollExtent);
})
]
)}
很簡單..按照這些步驟..
StatefullWidget
final ScrollController listScrollController = ScrollController();
ListView 應該是這樣的:
ListView.builder( controller: listScrollController, reverse: true,
如果您像這樣使用 firebase 更改順序:
.orderBy('timestamp', descending: true)
在您的發送按鈕中添加此代碼
listScrollController.animateTo(0.0,duration: Duration(milliseconds: 300), curve: Curves.easeOut);
自動向上滾動你的 textField,在Stack
添加你的textField
和ListView
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.