Flutter 小部件在颤振中占用了最大的空间
我在StreamBuilder中有一些小部件(消息气泡),但是当消息气泡适应内部文本的大小时,它们会占用尽可能多的空间。 这是主屏幕的代码:Flutter 小部件在颤振中占用了最大的空间,flutter,dart,Flutter,Dart,我在StreamBuilder中有一些小部件(消息气泡),但是当消息气泡适应内部文本的大小时,它们会占用尽可能多的空间。 这是主屏幕的代码: @override Widget build(BuildContext context) { return SafeArea( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
@override
Widget build(BuildContext context) {
return SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
StreamBuilder<QuerySnapshot>(
stream: _firestore.collection('messages').snapshots(),
builder: (context, snapshot){
List<Widget> messagesWidgets = [];
if (snapshot.hasData){
final messages = snapshot.data.docs;
for (var message in messages){
final messageText = message.data()['text'];
final messageSender = message.data()['sender'];
final messageWidget = MessageBubble(
text: messageText,
sender: messageSender,
);
messagesWidgets.add(messageWidget);
}
}
return Expanded(
child: ListView(
//padding: EdgeInsets.symmetric(horizontal: 0.0, vertical: 20.0),
children: messagesWidgets,
),
);
},
),
Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 6,
child: TextInput(
textAlign: TextAlign.left,
onChanged: (value){
messageText = value;
},
hintText: 'Type a message',
),
),
Expanded(
flex: 1,
child: Button(
child: Icon(Icons.send, color: background,),
function: (){
if(messageText.trim() == '') return;
_firestore.collection('messages').add({
'text': messageText,
'sender': Usr.email,
});
setState(() {
messageText = '';
});
},
tag: 'hey2d2',
),
),
],
),
),
],
),
);
下面是我的意思的截图:
之所以发生这种情况,是因为
ListView
小部件自动强制其子部件占用所有可用宽度。通过使用Align
小部件包装消息气泡容器,可以绕过此行为。见下文:
@覆盖
小部件构建(构建上下文){
返回对齐(
//将“对齐”的对齐设置为“左中心”。
对齐:alignment.centerLeft,
子:容器(
...
),
);
}
@override
Widget build(BuildContext context) {
return Container(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
child: Material(
elevation: 10.0,
borderRadius: BorderRadius.circular(30.0),
color: Colors.white,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'$sender',
style: TextStyle(
fontSize: 15.0,
fontWeight: FontWeight.bold,
color: background,
),
),
Text(
'$text',
style: TextStyle(
fontSize: 15.0,
color: background,
),
),
],
),
),
),
),
);