ListView Builder В инициализаторах можно получить доступ только к членам stati c - PullRequest
0 голосов
/ 29 мая 2020

Привет, я новичок в flutter

Я использую ListView.Builder, чтобы сделать что-то вроде этого:

enter image description here

Я использую два виджета: один для информации об адресе и один для добавления нового элемента адреса в ListView

Я использую обратный вызов, чтобы сообщить, что добавление IconButton было нажато, но я получил сообщение об ошибке: Доступны только члены stati c в инициализаторах. когда я вызываю addItemToList () метод

это код:

class TestPage2 extends StatefulWidget {
  @override
  _TestPage2State createState() => _TestPage2State();
}

class _TestPage2State extends State<TestPage2> {
  List<Widget> lwidgets = [
    _Adresses(),
    _HorizontalDivider(),
    _AddElement(() {
      addItemToList();
    })
  ];

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adresses());
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts'),
      ),
      backgroundColor: Color(0xFFE5E5EA),
      body: Column(
        children: <Widget>[
          Text('ADRESS'),
          Container(
            height: 200,
            child: ListView.builder(
              itemCount: lwidgets.length,
              itemBuilder: (BuildContext context, int index) {
                return (lwidgets[index]);
              },
              physics: NeverScrollableScrollPhysics(),
            ),
          ),
        ],
      ),
    );
  }
}

Это виджет _AddElement:

class _AddElement extends StatelessWidget {
  final Function() onAddItem;

  const _AddElement(this.onAddItem);

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 40,
      color: Colors.white,
      child: Row(
        children: <Widget>[
          Container(
            height: 40,
            color: Colors.white,
            child: IconButton(
              icon: Icon(Icons.add_circle),
              iconSize: 24,
              color: Color(0xFF34C759),
              onPressed: () {
                onAddItem();
              },
            ),
          ),
        ],
      ),
    );
  }
}

Я ожидаю, что когда я нажму на зеленую кнопку, в ListView будет добавлен новый элемент, например:

enter image description here

Я буду признателен за любую помощь.

Хосе Родригес

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Это еще один способ:

Я помещаю только один виджет _Adress в lwidgets и использую initState для AddElement widget

ДО

List<Widget> lwidgets = [
    _Adresses(),
    _HorizontalDivider(),
    _AddElement(() {
      addItemToList();
    })
  ];

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adresses());
    });
  }

ПОСЛЕ

 List<Widget> lwidgets = [
    _Adress(),
  ];

  @override
  void initState() {
    lwidgets.insert(lwidgets.length, _AddElement(() => {addItemToList()}));
    super.initState();
  }

  void addItemToList() {
    setState(() {
      lwidgets.insert(lwidgets.length - 1, _Adress());
    });
  }

И ставлю _HorizontalDivider () в _Adress виджет

0 голосов
/ 30 мая 2020

Я сделал некоторые изменения на основе вашего кода. Вы не включили другой виджет, такой как _Address, поэтому я добавил простой виджет для демонстрации

Вместо того, чтобы добавлять свой виджет дополнения в список, вы можете сделать оператор if в построителе представления списка, чтобы проверить, это последний индекс. По последнему индексу верните столбец, состоящий из _Address и виджета addelement. См. Прикрепленное изображение и код.

Сообщите мне, поможет ли это

     List<Widget lwidgets = [_Address()]

      void addItemToList() {
        setState(() {
          lwidgets.add(_Address());
        });
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Contacts'),
          ),
          backgroundColor: Color(0xFFE5E5EA),
          body: Container(child: Column(
            children: <Widget>[
              Text('ADDRESS'),
              Container(
                height: 200,
                child: ListView.builder(
                  // separatorBuilder: (context, index) => Divider(
                  //   indent: 0,
                  //   endIndent: 0,


                  // ),
                  itemCount: lwidgets.length,
                  itemBuilder: (BuildContext context, int index) {
                    //If its the last index of the lwidget list, append _AddElement under the _addresswidget
                    return index == lwidgets.length - 1
                        ? Column(
                            children: <Widget>[
                              _Address(),
                              _AddElement(addItemToList),
                            ],
                          )
                        : _Address();
                  },
                  physics: NeverScrollableScrollPhysics(),
                ),
              ),
            ],
          ),)
        );
      }
    }

    class _AddElement extends StatelessWidget {
      final Function() onAddItem;

      const _AddElement(this.onAddItem);

      @override
      Widget build(BuildContext context) {
        return Container(
          height: 40,
          color: Colors.white,
          child: Row(
            children: <Widget>[
              Container(
                height: 40,
                color: Colors.white,
                child: IconButton(
                  icon: Icon(Icons.add_circle),
                  iconSize: 24,
                  color: Color(0xFF34C759),
                  onPressed: () {
                    onAddItem();
                  },
                ),
              ),
            ],
          ),
        );
      }
    }

    class _Address extends StatelessWidget {
      const _Address();

      @override
      Widget build(BuildContext context) {
        return Container(
          height: 40,
          color: Colors.white,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Icon(Icons.delete),
              Text('Street Name'),
              Text("postal code"),
            ],
          ),
        );
      }
    }

Фаза начала

Добавлен 1 элемент

Добавлено больше товаров

...