Название в значительной степени говорит само за себя — я обнаружил, что виджет ConstrainedBox не работает, если он содержит строку или столбец.
Вот мой код:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Testing ConstrainedBox'),
),
body: ListView(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 25),
children: [
ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 600),
child: Card(
color: Colors.yellow,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
Padding(
padding: const EdgeInsets.only(right: 20),
child: Container(
color: Colors.red,
height: 50,
width: 50,
),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: const <Widget>[
Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'),
Padding(
padding: EdgeInsets.only(top: 20),
child: Text('Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'),
),
Padding(
padding: EdgeInsets.only(top: 20),
child: Text('Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'),
),
],
),
),
],
),
),
),
),
],
),
);
}
}
Если вы запустите это и увеличите окно, то «maxWidth» не будет применяться, и вместо этого карта вырастет до полной доступной ей ширины.
Я попытался поместить ConstrainedBox внутрь строки, но это не имеет значения, по-видимому, из-за столбца. Также обратите внимание, что избавление от ListView ничего не меняет.
У кого-нибудь есть идеи, почему это не работает?
ListView
заставляет своих детей иметь максимальную ширину. Вы можете обернуть дочерние элементы другим виджетом, который их закроет.
body: ListView(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 25),
children: [
Align(
alignment: Alignment.centerLeft,
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 600),
можешь попробовать flutter clean
и пересобрать приложение.
хорошо, это, кажется, исправило это, но зачем мне нужно было очищать, а затем перестраивать мои пакеты - это что-то, что только что было исправлено, и у меня просто оказалась старая версия "материального" пакета (или, может быть, другой пакет) с ошибкой?
ig иногда возникает проблема с кешем в режиме отладки,
ОМГ это ужасно! Спасибо за ваш совет :-)
Нет, это не работает. Обратите внимание, что если я полностью удалю ListBox, я получу ту же проблему.