Android 如何避免键盘弹出时重新加载整页?

Android 如何避免键盘弹出时重新加载整页?,android,flutter,dart,Android,Flutter,Dart,查看此视频以了解问题演示 由于有大量代码,我将尝试在这里总结代码的结构。 简言之: Scaffold( appBar: AppBar(), body: StreamBuilder<dynamic>( stream: globals.chatRoomBloc.threadScreen, builder: (BuildContext context, AsyncSnapshot snapshot) { return Column( c

查看此视频以了解问题演示

由于有大量代码,我将尝试在这里总结代码的结构。 简言之:

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();
                },
              ),
            ),
          ),
        ],
      );
    },
  ),
)
脚手架(
appBar:appBar(),
正文:StreamBuilder(
流:globals.chatRoomBloc.threadScreen,
生成器:(BuildContext上下文,异步快照){
返回列(
横轴对齐:
CrossAxisAlignment.stretch,//粘在键盘上
儿童:[
扩大(
子:滚动条(
子项:ListView.builder(
收缩膜:对,
itemCount:list.length,
itemBuilder:(构建上下文,int索引){
返回TileWidget();
},
),
),
),
],
);
},
),
)
TileWidget是有状态的,在按下回复按钮时追加文本字段并调整小部件的大小。然后,当用户单击文本字段时,键盘弹出

现在我的问题是,当键盘弹出时,屏幕会重新加载

我尝试了以下解决方案:

  • :我只设置了一次流,即第一次加载页面时。添加新聊天或条目时,对流进行任何更改。就我而言,这种情况不会发生
  • 我不确定这是否是同一个问题,但解决方案对我来说没有任何改变
  • -我也经历过,但没有帮助

  • 我认为屏幕正试图调整大小并重新绘制以适应键盘抽屉。但由于某些原因,它未能做到这一点,并重新加载所有内容。我错过什么了吗?有办法解决这个问题吗?

    您提供的一个链接指出,只要应用程序的状态发生变化,即键盘弹出,您的构建方法就会触发,因此请将streambuilder移到它之外。您还可以做一些更改。试试下面的方法

    在构建方法之外创建一个变量

    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();
                            },
                          ),
                        ),
                      ),
                    ],
                  );
                },
              ),
    
    编辑:确保检查快照是否有数据。如果没有数据,那么应该返回一些数据,直到它有数据为止,这样用户就可以知道应用程序正在做什么


    此外,此属性也可能对您有所帮助。resizeToAvoidBottomInset-

    找到解决方案了吗?@Jatin我发现问题在于,当用户单击按钮时,Streambuilder会触发屏幕重画。所以我重新安排了代码,以防止在这种情况下触发流。不过我对这个解决方案并不满意,因为我不知道它是否在所有情况下都适用。因此,我仍在等待更好的解决方案。
    Scaffold(
      appBar: AppBar(),
      resizeToAvoidBottomInset: false, //don't forget this!
      body: myStreamBuilder
    )