如何正确使用堆栈?
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,
您的堆栈小部件将解决您的问题。
我正在尝试使用显示列表视图和 这是我的代码
@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,
您的堆栈小部件将解决您的问题。