如何正确使用堆栈?

How to use a stack correctly?

我正在尝试使用显示列表视图和 这是我的代码

@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();
        },
      ),
    );

然后是_conversationPageUI();这是这里吗

 Widget _conversationPageUI() {
    return Builder(builder: (BuildContext _context) {
      return Stack(
        overflow: Overflow.visible,
        children: <Widget>[
          _messageLisView(),
          Align(
            alignment: Alignment.bottomCenter,
            child: _messageField(_context),
          ),
        ],
      );
    });
  }

然后每个小部件都在这里

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(),
          ],
        ),
      ),
    );
  }

_messageField 只是一个带有 hintext 和 2 个图标的 Textformfield。这是它的样子

如您所见,我无法正确看到最后一个列表视图项目,这就是我的问题,我该如何解决?

只需将填充添加到列表视图的底部:

Widget _messageLisView() {
    final user = Provider.of<Userforid>(context);
    return Container(
      padding: EdgeInsets.only(bottom: 100),
      width: _deviceWidth,
Padding(
    padding: const EdgeInsets.only(bottom:MediaQuery.of(context).size.height * 0.1),
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);
            },
          ),
         )

//或

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,

您的堆栈小部件将解决您的问题。