SliverList не обновляется должным образом - PullRequest
0 голосов
/ 01 мая 2020

Я новичок во Флаттере, так что прости меня за недоразумение.

В конечном счете, я пытаюсь получить список фрагментов, каждый со списком виджетов (элементов), и этот список фрагментов может изменить, а также можно изменить каждый список предметов.
Что-то вроде:

  • Щепка
    • Предмет
    • Предмет
      ...
  • Щепка
    • Артикул
      ...

et c, но я могу продолжать добавлять и удалять щепки и предметы по желанию. Мой наивный подход в основном заключается в следующем:

  1. В моей основной функции построения виджета создайте CustomScrollView.
  2. Пусть эта CustomScrollView ссылается на список переменных элемента для его фрагментов. Аргумент.
  3. Добавить кнопку для создания новых элементов (добавьте элемент в список элементов).
  4. Добавить кнопку для создания новых элементов (добавить элемент в список элементов).
  5. Вызовите setState() при добавлении элемента в (4).
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;
  final List<Widget> slivers = [];
  final List<Text> items = [];

  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  void _addSliver() {
    widget.slivers.add(SliverList(
      delegate: SliverChildBuilderDelegate(
              (context, index) {
                return index < widget.items.length ? widget.items[index] : null;
              })));
  }

  void _addToList() {
    setState(() {
      widget.items.add(Text('Item ${widget.items.length + 1}'));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.category),
            onPressed: _addSliver,
          ),
          IconButton(
            icon: Icon(Icons.add),
            onPressed: _addToList,
          )
        ],
      ),
      body: CustomScrollView(
        slivers: widget.slivers,
      ),
    );
  }
}

Приведенный выше код предназначен только для проверки одного элемента и нескольких элементов в этом элементе. Во время отладки я заметил, что уже существующий осколок не перестраивается в функции _build в sliver.dart, потому что он уже существует на карте, поэтому мое понимание того, как этого можно достичь, неверно.

Мне просто нужно заставить его как-то перестраивать? Или есть гораздо более простой способ сделать это, которого мне не хватает?

1 Ответ

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

Кажется, идея отличается от использования массива для хранения, например, дочерних элементов Column. Виджеты нужно перестраивать каждый раз, когда вызывается build (кроме видимых фактических виджетов).

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;
  final Map<int, List<Text>> slivers = {};

  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  void _addSliver() {
    widget.slivers[widget.slivers.length] = [];
  }

  void _addToList(int listNumber) {
    setState(() {
      widget.slivers[listNumber].add(Text('Item ${widget.slivers[listNumber].length + 1}'));
    });
  }

  List<Widget> _buildSlivers() {
    List<Widget> slivers = [];
    widget.slivers.forEach((key, value) {
      slivers.add(SliverList(
        delegate: SliverChildBuilderDelegate(
                (context, index) => index < widget.slivers[key].length ?
                widget.slivers[key][index] : null)));
    });
    return slivers;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.category),
            onPressed: _addSliver,
          ),
          IconButton(
            icon: Icon(Icons.add),
            onPressed: () => _addToList(widget.slivers.length - 1),
          )
        ],
      ),
      body: CustomScrollView(
        slivers: _buildSlivers(),
      ),
    );
  }
}

Если есть лучший способ для этого, я бы очень хотел знать .

...