Ваша проблема в первую очередь довольно проста, вы нарушаете концепцию DRY (не повторяйтесь, https://en.wikipedia.org/wiki/Don%27t_repeat_yourself).
Как только вы начнете копировать вставку кода, подумайте о своем коде и о том, как вы можете абстрагировать его в повторно используемый компонент.
Еще одна большая проблема, которой, как мне кажется, вам не хватает, - это именование переменных. Это очень важная часть написания кода. Это может показаться тривиальным, но будет очень сложно понять, что на самом деле означают переменные с именами cardOne1
и cardTwo2
. Какова цель этой переменной? Что оно делает?
Теперь, с учетом сказанного, я понимаю, что ваше приложение как-то связано с продажей автомобилей, но в остальном я не совсем уверен, на что я смотрю. Там мне будет труднее найти хорошую переменную для этого кода, но вот пример.
Итак, давайте разберем содержимое карточки на один виджет многократного использования, мы также можем создать класс данных (или модель) для хранения данных, которые мы затем передаем виджету.
//car_details.dart
class CarDetails {
String title;
String diffNumber;
String diffPercent;
Color colorIndicator;
CarDetails({
this.title,
this.diffNumber,
this.diffPercent,
this.colorIndicator,
});
}
//car_card_details.dart
class CarCardDetails extends StatelessWidget {
final double padding;
final CarDetails carDetails;
CarCardDetails({
this.carDetails,
this.padding = 15,
});
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
carDetails.colorIndicator != null
? Container(
color: carDetails.colorIndicator,
height: 60,
width: 2,
)
: Container(),
Padding(
padding: EdgeInsets.all(padding),
child: Column(children: [
Text(carDetails.title),
Text(carDetails.diffNumber),
Text(carDetails.diffPercent),
VerticalDivider(color: Colors.blue),
])),
],
);
}
}
Чтобы использовать этот компонент, мы создаем виджет CarCard, который принимает заголовок и список CarDetails следующим образом:
// car_card.dart
class CarCard extends StatelessWidget {
final String title;
final List<CarDetails> carDetails;
CarCard({this.title, this.carDetails});
@override
Widget build(BuildContext context) {
List<Widget> detailRow = List();
if (carDetails != null) {
carDetails.forEach((element) {
detailRow.add(CarCardDetails(
top: element.title,
middle: element.diffNumber,
bottom: element.diffPercent,
lineColor: element.colorIndicator,
));
});
}
return Container(
//height: 150, //I would not hardcode the height, let the childrent expand the widget instead
child: SingleChildScrollView(
child: Card(
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
child: InkWell(
child: Column(children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(children: [
Text(
title,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
Spacer(),
Icon(Icons.favorite)
]),
),
Divider(color: Colors.black),
Row(children: detailRow),
]),
),
),
),
);
}
}
И вместо того, чтобы сохранять все переменные, которые у вас были в приложении, теперь мы можем превратить их в список CarDetails, где каждый элемент содержит строки.
// some other widget
...
List<CarDetails> carDetails = [
CarDetails(
title: "2 hrs ago",
diffNumber: "+/ TRACK",
diffPercent: "% to DBJ",
),
CarDetails(
title: "CHEVEROLET",
diffNumber: "-2706",
diffPercent: "42.2%",
colorIndicator: Colors.red,
),
CarDetails(
title: "BUICK",
diffNumber: "+300",
diffPercent: "50%",
colorIndicator: Colors.green,
),
CarDetails(
title: "GMC",
diffNumber: "-712",
diffPercent: "52.1%",
colorIndicator: Colors.black26,
),
];
@override
Widget build(BuildContext context) {
return CarCard(
title: "US Daily Retail Delieveries by Brand",
carDetails: carDetails,
);
}
...
Конечно, это можно абстрагироваться еще дальше с помощью групп карточек и т. Д. Но я надеюсь, что вы уловили идею.
Это пример того, как вы могли бы это сделать, с учетом сказанного, я не знаю, какие данные вы собираетесь использовать и как вы хотите их структурировать. Так что считайте это отправной точкой и начните с нее. :)
person
Isak dl
schedule
14.05.2020
App
для хранения данных карты, вы можете сохранить все данные, относящиеся непосредственно к отдельным картам, как объектCard
и сохранитьCard
s вApp
. - person Christopher Moore   schedule 14.05.2020