Flutter Wrap widget align: left inside ExpansionPanel

Flutter Wrap widget align: left inside ExpansionPanel

这很奇怪,包含 FilterChips 的 Wrap 小部件在其父级 ExpansionPanel 中居中。我试过将 Wrap Widget 包装在 Flexible 小部件中,没有反应,我尝试过将 Wrap Widget 包装在 Expanded 小部件中,没有反应。

扩展面板上似乎没有 属性 左对齐正文:小部件。这很重要,因为当 Wrap 小部件被强制为全宽时,一些 ExpansionPanel 向左对齐,而其他的(如图所示)居中。最终,我将把 ExpansionPanel 中的所有子小部件包装在一个 Padding 小部件中,但我需要子 Wrap 小部件先左对齐。

bool travelSack;
ExpansionPanelRadio backpackingPanel = ExpansionPanelRadio(
            value: "Backpacking",
            headerBuilder: (BuildContext context, bool isExpanded) {
              return ListTile(
                leading: FaIcon(
                  FontAwesomeIcons.globeEurope,
                  size: 19,
                ),
                title: Text("Backpacking"),
              );
            },
            body: Expanded(child:
            Wrap(spacing: 4, children: [
              FilterChip(
                showCheckmark: false,
                label: Text('Travel rucksack'),
                labelStyle: TextStyle(
                  color: travelSack ? Colors.black : Colors.white,
                ),
                selected: travelSack,
                onSelected: (bool selected) {
                  setState(() {
                    travelSack = !travelSack;
                  });
                },
                selectedColor: Colors.green.shade500,
                backgroundColor: Colors.grey.shade500,
              ),
        ])
    );

我是 Scoobied,感谢帮助。

我通过将 Wrap 小部件嵌套在 Align 小部件中解决了这个问题:

 Align(
            alignment: Alignment.topLeft, 
child: Wrap(....

我不喜欢我的解决方案,我担心过多的嵌套对性能的影响以及庞大的代码会损害易读性,所以如果您有更好的解决方案,我会全神贯注。 x 山姆

Wrap 有一个 alignment 属性 可以用来对齐 children。 https://api.flutter.dev/flutter/widgets/Wrap/Wrap.html

Wrap(
  ...
  alignment: WrapAlignment.center,
  children: [],
),

我遇到了同样的问题,用 SizedBox 解决了:

ExpansionPanelRadio backpackingPanel = ExpansionPanelRadio(
  value: "Backpacking",
  headerBuilder: (BuildContext context, bool isExpanded) {},
  body: SizedBox(
    width: double.infinity, // Use when direction: Axis.horizontal
    height: double.infinity, // Use when direction: Axis.vertical
    child: Wrap(
      spacing: 4,
      children: [
        FilterChip(
          showCheckmark: false,
          label: Text('Travel rucksack'),
          labelStyle: TextStyle(
            color: travelSack ? Colors.black : Colors.white,
          ),
          selected: travelSack,
          onSelected: (bool selected) {
            setState(() {
              travelSack = !travelSack;
            });
          },
          selectedColor: Colors.green.shade500,
          backgroundColor: Colors.grey.shade500,
        ),
      ],
    ),
  ),
);

切记不要同时使用宽度和高度SizedBox 属性,每个Wrap.direction.

Reference