Firebase 如何正确使用堆栈?
我正在尝试使用一个堆栈,其中显示一个listview和一个 这是我的密码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
@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,