как исправить слишком много переменных во флаттере

Я пытаюсь создать стопки карточек в своем проекте Flutter. Каждая карта содержит разные данные / информацию, и когда я пытаюсь визуализировать фиктивные данные, мне приходится использовать множество переменных, которые в значительной степени повторяют имя переменной для каждой карты. Есть ли способы сделать повторно используемый компонент карты во флаттере, чтобы я мог сделать его ясным и простым, потому что, когда я буду использовать реальные данные в будущем, у меня может быть более двух карт в группе, и они также будут иметь разные данные. Любое предложение будет действительно оценено.

class MyConstructor {


MyConstructor({this.jonathan1,this.jonathan2,this.jonathan3});
}


class StackedCardsState extends State<HomePage> {

  List<MyConstructor> cards = [
    MyConstructor(h1: "Hello", h2: "hello3")
  ];

/////
                  Padding(
                      padding: EdgeInsets.all(15.0),
                      child: Column(children: [
                        Text(MyConstructor.hey, style: TextStyle(fontWeight: FontWeight.bold),),
                        Text(MyConstructor.hey),
                        Text(MyConstructor.hey, style: TextStyle(color: Colors.red[500]),),
                        VerticalDivider(color: Colors.blue),
                      ])),


person aase lab    schedule 14.05.2020    source источник
comment
Вместо того, чтобы использовать множество переменных в объекте App для хранения данных карты, вы можете сохранить все данные, относящиеся непосредственно к отдельным картам, как объект Card и сохранить Cards в App.   -  person Christopher Moore    schedule 14.05.2020
comment
@ChristopherMoore Привет .. спасибо за комментарии, но не могли бы вы показать мне, как это сделать? Я как бы застрял прямо сейчас, поэтому буду признателен, если вы покажете мне, как я могу следовать за мной. Спасибо   -  person aase lab    schedule 14.05.2020


Ответы (1)


Ваша проблема в первую очередь довольно проста, вы нарушаете концепцию 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