vzu*_*urd 5 android dart flutter
观看此视频以了解问题演示 https://youtu.be/GsdWcTEbUbg
由于代码较多,我在这里尝试总结一下代码的结构。简而言之:
Scaffold(
appBar: AppBar(),
body: StreamBuilder<dynamic>(
stream: globals.chatRoomBloc.threadScreen,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return Column(
crossAxisAlignment:
CrossAxisAlignment.stretch, // sticks to the keyboard
children: <Widget>[
Expanded(
child: Scrollbar(
child: ListView.builder(
shrinkWrap: true,
itemCount: list.length,
itemBuilder: (BuildContext context, int index) {
return TileWidget();
},
),
),
),
],
);
},
),
)
Run Code Online (Sandbox Code Playgroud)
TileWidget 是有状态的,当按下回复按钮时会附加 TextField 并调整小部件的大小。然后,当用户单击文本字段时,键盘就会弹出。
现在我的问题是,当键盘弹出时,屏幕会重新加载。
我尝试了以下解决方案:
我认为屏幕正在尝试调整大小并重新绘制以适应键盘抽屉。但由于某种原因未能做到这一点并重新加载所有内容。我错过了什么吗?有没有解决的办法 ?
正如您提供的链接之一指出,只要应用程序的状态发生变化(即弹出键盘),您的构建方法就会触发,因此请将流构建器移到其外部。您还可以进行一些其他更改。尝试以下操作,
在构建方法之外创建一个变量。
var myStreamBuilder;
//....
//inside initialstate method
myStreamBuilder = StreamBuilder<dynamic>(
stream: globals.chatRoomBloc.threadScreen,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return Column(
crossAxisAlignment:
CrossAxisAlignment.stretch, // sticks to the keyboard
children: <Widget>[
Expanded(
child: Scrollbar(
child: ListView.builder(
shrinkWrap: true,
itemCount: list.length,
itemBuilder: (BuildContext context, int index) {
return TileWidget();
},
),
),
),
],
);
},
),
Run Code Online (Sandbox Code Playgroud)
然后在构建方法中调用该变量。
Scaffold(
appBar: AppBar(),
resizeToAvoidBottomInset: false, //don't forget this!
body: myStreamBuilder
)
Run Code Online (Sandbox Code Playgroud)
编辑:确保检查快照是否有数据。如果没有数据,那么应该返回一些内容,直到有数据为止,这样用户就可以知道应用程序正在做什么。
此外,此属性也可能对您有帮助。resizeToAvoidBottomInset - https://api.flutter.dev/flutter/material/Scaffold/resizeToAvoidBottomInset.html
| 归档时间: |
|
| 查看次数: |
5286 次 |
| 最近记录: |