Порхающий текст и виджет стека расположены равномерно

#flutter

#трепетать

Вопрос:

Я пытаюсь создать индикатор состояния во флаттере с текстовой меткой слева и виджетом стека справа, мне удается расположить их с помощью строки, но ширина каждого виджета разделена неравномерно, и максимальная ширина стека переполняется контейнером.

Вот мой код до сих пор.

 import 'package:flutter/material.dart';  class CustomIndicatorBar extends StatelessWidget {  const CustomIndicatorBar({  Key key,  @required this.percent,  @required this.title,  }) : super(key: key);  final double percent;  final String title;  @override  Widget build(BuildContext context) {  return Padding(  padding: const EdgeInsets.symmetric(horizontal: 8.0),  child: LayoutBuilder(  builder: (BuildContext context, BoxConstraints constraints) {  final double maxBarWidth = constraints.maxWidth;  double barWidth = percent * maxBarWidth;  if (barWidth lt; 0) {  barWidth = 0;  }  return Expanded(  child: Row(  mainAxisAlignment: MainAxisAlignment.spaceBetween,  children: [  Text(  title,  style: const TextStyle(  fontWeight: FontWeight.bold,  ),  ),  Stack(  children: [  Container(  height: 20.0,  decoration: const BoxDecoration(  color: Color(0xFF555454),  ),  ),  Container(  height: 20.0,  width: barWidth,  decoration: const BoxDecoration(  color: Color(0xFFFA9F1D),  ),  )  ],  )  ],  ),  );  },  ),  );  } }  

Вот результат

Выход флаттера

Чего я хочу добиться, так это распределить их равномерно, и ширина стека не будет переполняться из контейнера.

Ответ №1:

Пожалуйста, попробуйте мое решение:

введите описание изображения здесь

Результат: введите описание изображения здесь

Полный код:

 import 'package:flutter/material.dart';  void main() {  runApp(const MaterialApp(  title: 'Demo',  home: FirstRoute(),  )); }  class FirstRoute extends StatefulWidget {  const FirstRoute({Key? key}) : super(key: key);   @override  Statelt;FirstRoutegt; createState() =gt; _FirstRouteState(); }  class _FirstRouteState extends Statelt;FirstRoutegt; {  @override  Widget build(BuildContext context) {  return Scaffold(  appBar: AppBar(  title: const Text('First Route'),  ),  body: Column(  children: const [  SizedBox(height: 16),  CustomIndicatorBar(  title: 'Mood',  percent: 0.5,  ),  SizedBox(height: 16),  CustomIndicatorBar(  title: 'Hunger',  percent: 0.7,  ),  ],  ),  );  } }  class CustomIndicatorBar extends StatelessWidget {  const CustomIndicatorBar({  Key? key,  required this.percent,  required this.title,  }) : super(key: key);   final double percent;  final String title;   @override  Widget build(BuildContext context) {  return Padding(  padding: const EdgeInsets.symmetric(horizontal: 8.0),  child: Row(  mainAxisAlignment: MainAxisAlignment.spaceBetween,  children: [  Expanded(  child: Text(  title,  style: const TextStyle(  fontWeight: FontWeight.bold,  ),  ),  ),  Expanded(  child: Stack(  children: [  Container(  height: 20.0,  decoration: const BoxDecoration(  color: Color(0xFF555454),  ),  ),  LayoutBuilder(builder: (context, constraints) {  return Container(  height: 20.0,  width: constraints.maxWidth * percent,  decoration: const BoxDecoration(  color: Color(0xFFFA9F1D),  ),  );  })  ],  ),  )  ],  ),  );  } }  

Комментарии:

1. Спасибо, что это сработало, можно ли в любом случае изменить пространство между удаленными виджетами?

2. Вы можете вставить SizedBox(width: 8) между ними 🙂