观看此视频以了解问题演示 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 并调整小部件的大小。然后,当用户单击文本字段时,键盘就会弹出。
现在我的问题是,当键盘弹出时,屏幕会重新加载。
我尝试了以下解决方案:
我认为屏幕正在尝试调整大小并重新绘制以适应键盘抽屉。但由于某种原因未能做到这一点并重新加载所有内容。我错过了什么吗?有没有解决的办法 ?
在我的配置文件页面中,当使用单击编辑图标时,我具有使用布尔条件的文本选项,将文本窗口小部件更改为文本
widget.isUpdate ? new Flexible(child: new TextField()) : Text("Text Widget")字段窗口小部件,但当文本字段聚焦时,键盘已打开,此时StatefulWidget重新创建,因此布尔值再次变为false,然后文本字段移至文本窗口小部件。仅当页面具有导航器推入页面(第二页)时,才会发生这种情况
Navigator.push(context,MaterialPageRoute(builder: (context) => UpdateProfile()))
Run Code Online (Sandbox Code Playgroud)
如果此页面为默认主页,则工作正常。我没有犯什么错误。
代码:
import 'package:flutter/material.dart';
class UpdateProfile extends StatefulWidget {
bool isUpdate = false;
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return UpdateProfileState();
}
}
class UpdateProfileState extends State<UpdateProfile> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text("Update"),
elevation: 2.0),
body: Container(
width: double.infinity,
height: double.infinity,
color: Colors.red,
margin: const EdgeInsets.all(10.0),
child: Row(
children: <Widget>[
widget.isUpdate ? new …Run Code Online (Sandbox Code Playgroud)