Добавьте прокрутку в ListView.builder в приложении Flutter - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сделать прокрутку представления списка способной, когда я погуглил и не смог найти понятное и простое решение, я попытался сделать собственную прокрутку (пример по ссылке https://docs.flutter.io/flutter/widgets/ListView-class.html), на данный момент это не так рабочий.

Вот код:

CustomScrollView(
  shrinkWrap: true,
  slivers: <Widget>[
    SliverPadding(
      padding: const EdgeInsets.all(20.0),
      sliver: SliverList(
        delegate: SliverChildListDelegate(
          <Widget>[
            StreamBuilder(
            stream: Firestore.instance.collection("Items").snapshots(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if (snapshot.hasData) {
                return new ListView.builder(
                  padding: const EdgeInsets.only(top: 5.0),
                  scrollDirection: Axis.vertical,
                    shrinkWrap: true,
                    itemCount: snapshot.data.documents.length,

                    itemBuilder: (BuildContext context,int index) {
                      DocumentSnapshot ds = snapshot.data.documents[index];
                      return new Row(

                        textDirection: TextDirection.ltr,
                        children: <Widget>[
                          Expanded(child: Text(ds["item1"])),
                          Expanded(child: Text(ds["item2"])),
                          Expanded(child: Text(ds["price"].toString())),
                        ],
                      );
                    });
              }
              else {
                return Align(
                  alignment: FractionalOffset.bottomCenter,
                  child: CircularProgressIndicator(),
                );

              }
            },
          )
          ],
        ),
      ),
    ),
  ],
)

Ниже приведен скриншот с эмулятора (добрый узел, такой же на телефоне): enter image description here

Пожалуйста, помогите мне с указателями или примером кода для просмотра списка с возможностью прокрутки.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Вы заключаете ListView в SliverList, что не очень хорошая идея, если они имеют одинаковое направление прокрутки. Вы можете сделать Column с генератором List.generate() (неэффективно) или избавиться от одного из ListView:

CustomScrollView(
  shrinkWrap: true,
  slivers: <Widget>[
    StreamBuilder(
      stream: Firestore.instance.collection("Items").snapshots(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasData) {
          return SliverPadding(
            padding: const EdgeInsets.all(20.0),
            sliver: SliverList(
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  DocumentSnapshot ds = snapshot.data.documents[index];
                  return new Row(
                    textDirection: TextDirection.ltr,
                    children: <Widget>[
                      Expanded(child: Text(ds["item1"])),
                      Expanded(child: Text(ds["item2"])),
                      Expanded(child: Text(ds["price"].toString())),
                    ],
                  );
                },
                childCount: snapshot.data.documents.length,
              ),
            ),
          );
        } else {
          return SliverFillRemaining(
            child: Center(
              child: CircularProgressIndicator(),
            ),
          );
        }
      },
    ),
  ],
);

Если этот фрагмент кода не работает, замените StreamBuilder на CustomScrollView

0 голосов
/ 10 января 2019

ListView сам по себе является списком с возможностью прокрутки, поэтому вы просто создаете его с помощью своих пользовательских плиток. Вот код из моего списка дел, который я использовал для создания списка своих дел. Ну, я вызываю эту функцию, когда мне нужно создать список.

/*Called each time the widget is built.
* This function creates the list with all items in '_todoList'
* */
Widget _buildTodoList() {
  return new ListView.builder(
    // itemBuilder will be automatically be called as many times as it takes for the
    // list to fill up its available space, which is most likely more than the
    // number of to do items we have. So, we need to check the index is OK.
    itemBuilder: (context, index) {
      if (index < _todoList.length) {
        return _buildTodoItem(_todoList[index],index);
      }
    },
  );
}

Теперь эта функция вызывает функцию _buildTodoItem, которая создает отдельный пользовательский элемент списка.

 /*Build a single List Tile*/
Widget _buildTodoItem(TodoItem todoItem,int index) {
  //return a custom build single tile for your list
}
0 голосов
/ 10 января 2019

Вам не нужно использовать CustomScrollView. ListView - это сам прокручиваемый виджет. Так что вам нужно только создать его внутри вашего StreamBuilder.

@override
Widget build(BuildContext context) {
  return StreamBuilder<List<int>>(
    stream: posts,
    builder: (BuildContext context, AsyncSnapshot<List<int>> snapshot) {
      if (snapshot.hasError) {
        return Text('Error: ${snapshot.error}');
      }
       switch (snapshot.connectionState) {
        case ConnectionState.waiting:
          return const Text('Loading...');
        default:
          if (snapshot.data.isEmpty) {
            return const NoContent();
          }
          return _itemList(snapshot.data);
      }
    },
  );
}

CustomScrollView используется для добавления виджета Sliver внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...