Firebase 如何正确使用堆栈?

Firebase 如何正确使用堆栈?,firebase,flutter,google-cloud-firestore,material-design,Firebase,Flutter,Google Cloud Firestore,Material Design,我正在尝试使用一个堆栈,其中显示一个listview和一个 这是我的密码 @override Widget build(BuildContext context) { final user = Provider.of<Userforid>(context); _deviceHeigth = MediaQuery.of(context).size.height; _deviceWidth = MediaQuery.of(context).size.width

我正在尝试使用一个堆栈,其中显示一个listview和一个 这是我的密码

@override
  Widget build(BuildContext context) {
    final user = Provider.of<Userforid>(context);
    _deviceHeigth = MediaQuery.of(context).size.height;
    _deviceWidth = MediaQuery.of(context).size.width;
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
        elevation: 0.0,
        title: Text(this.widget._receivername),
      ),
      body: StreamBuilder<UserData>(
        stream: DatbaseService(uid: user.uid).userData,
        builder: (context, snapshot) {
          return _conversationPageUI();
        },
      ),
    );
@覆盖
小部件构建(构建上下文){
最终用户=提供者(上下文);
_deviceHeigth=MediaQuery.of(context).size.height;
_deviceWidth=MediaQuery.of(context).size.width;
返回脚手架(
appBar:appBar(
背景颜色:颜色。透明,
标高:0.0,
标题:文本(此.widget.\u接收方名称),
),
正文:StreamBuilder(
流:DatbaseService(uid:user.uid).userData,
生成器:(上下文,快照){
返回_conversationPageUI();
},
),
);
然后是这里的_conversationPageUI()

 Widget _conversationPageUI() {
    return Builder(builder: (BuildContext _context) {
      return Stack(
        overflow: Overflow.visible,
        children: <Widget>[
          _messageLisView(),
          Align(
            alignment: Alignment.bottomCenter,
            child: _messageField(_context),
          ),
        ],
      );
    });
  }
Widget_conversationPageUI(){
返回生成器(生成器:(BuildContext\u context){
返回堆栈(
溢出:溢出。可见,
儿童:[
_messageLisView(),
对齐(
对齐:对齐.bottomCenter,
子项:_消息字段(_上下文),
),
],
);
});
}
然后每个小部件都在这里

Widget _messageLisView() {
    final user = Provider.of<Userforid>(context);
    return Container(
      width: _deviceWidth,
      child: StreamBuilder<Conversation>(
        stream: DatbaseService.instance
            .getConversation(this.widget._convertsationID),
        builder: (BuildContext _context, _snapshot) {
          if (_listViewController.hasClients) {
            _listViewController.animateTo(
                _listViewController.position.maxScrollExtent,
                duration: const Duration(milliseconds: 200),
                curve: Curves.easeOut);
          }
          var _conversationData = _snapshot.data;
          if (_conversationData != null) {
            if (_conversationData.messages != null) {
              return ListView.builder(
                controller: _listViewController,
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
                itemCount: _conversationData.messages.length,
                itemBuilder: (BuildContext _context, int _index) {
                  var _message = _conversationData.messages[_index];
                  bool _isOwnMessage = _message.senderID == user.uid;
                  return _messageListViewChild(_isOwnMessage, _message);
                },
              );
            } else {
              return Align(
                alignment: Alignment.center,
                child: Text("Let's start a Conversation"),
              );
            }
          } else {
            return Center(
                child: Container(
              child: CircularProgressIndicator(),
            ));
          }
        },
      ),
    );
  }

  Widget _messageField(BuildContext _context) {
    return Container(
      height: _deviceHeigth * 0.07,
      decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.circular(100),
          border: Border.all(color: Colors.black, width: 2)),
      margin: EdgeInsets.symmetric(
          horizontal: _deviceWidth * 0.04, vertical: _deviceHeigth * 0.03),
      child: Form(
        key: _formKey,
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            _messageTextField(),
            _sendMessageButton(_context),
            _videoMessageButton(),
          ],
        ),
      ),
    );
  }
Widget\u messageLisView(){
最终用户=提供者(上下文);
返回容器(
宽度:_设备宽度,
孩子:StreamBuilder(
流:DatbaseService.instance
.getConversation(此.widget.\u convertsationID),
生成器:(BuildContext\u context,\u snapshot){
if(_listViewController.hasClients){
_listViewController.animateTo(
_listViewController.position.maxScrollExtent,
持续时间:常数持续时间(毫秒:200),
曲线:Curves.easeOut);
}
var\u conversationData=\u snapshot.data;
if(_conversationData!=null){
if(_conversationData.messages!=null){
返回ListView.builder(
控制器:_listViewController,
填充:边缘组。对称(水平:10,垂直:10),
itemCount:_conversationData.messages.length,
itemBuilder:(BuildContext\u context,int\u index){
var\u message=\u conversationData.messages[\u index];
bool\u isOwnMessage=\u message.senderID==user.uid;
返回_messageListViewChild(_isOwnMessage,_message);
},
);
}否则{
返回对齐(
对齐:对齐.center,
孩子:文本(“让我们开始对话”),
);
}
}否则{
返回中心(
子:容器(
子对象:CircularProgressIndicator(),
));
}
},
),
);
}
Widget\u messageField(BuildContext\u context){
返回容器(
高度:_设备高度*0.07,
装饰:盒子装饰(
颜色:颜色,白色,
边界半径:边界半径。圆形(100),
边框:边框。全部(颜色:Colors.black,宽度:2)),
边距:边缘组。对称(
水平方向:_设备宽度*0.04,垂直方向:_设备高度*0.03),
孩子:表格(
键:_formKey,
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
crossAxisAlignment:crossAxisAlignment.center,
mainAxisSize:mainAxisSize.max,
儿童:[
_messageTextField(),
_sendMessageButton(_上下文),
_videoMessageButton(),
],
),
),
);
}
_messageField只是一个Textformfield,有一个hintext和两个图标


如您所见,我无法正确查看最后一个listview项,这就是我的问题,我如何解决这个问题?

只需在listview底部添加填充:

Widget _messageLisView() {
    final user = Provider.of<Userforid>(context);
    return Container(
      padding: EdgeInsets.only(bottom: 100),
      width: _deviceWidth,
Widget\u messageLisView(){
最终用户=提供者(上下文);
返回容器(
填充:仅限边缘设置(底部:100),
宽度:_设备宽度,
//或

我想是传球

fit: StackFit.expand,

“添加到堆栈”小部件将解决您的问题。

好的,我刚才使用了padding:EdgeInsets。仅限(底部:90),但是当我来到此页面时,maxscrollextent没有正确滚动为什么?这只是因为您的文本字段在底部对齐,请将您的messagefield放入Scaffold(底部:页),您仍然需要对其主题数据进行一些小的更改。请将maxscrollextent正在对您的UI执行的操作的屏幕截图上载到您的UI中。或者您可以使用SizedBox包装您的listview,高度为:MediaQuery.of(上下文).size.height*0.80I不认为堆栈是这里小部件的正确选择。您可以使用文本框的
底页
。然后将
填充
添加到脚手架的
主体
。它应该适合您。
sizedBox(
    height: MediaQuery.of(context).size.height * 0.80,
child: ListView.builder(
            controller: _listViewController,
            padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
            itemCount: _conversationData.messages.length,
            itemBuilder: (BuildContext _context, int _index) {
              var _message = _conversationData.messages[_index];
              bool _isOwnMessage = _message.senderID == user.uid;
              return _messageListViewChild(_isOwnMessage, _message);
            },
          ),
         )
fit: StackFit.expand,