Как исправить ListView в столбце и добавить RefreshIndicator в ListView

У меня есть ListView в столбце, и мне нужно добавить RefreshIndicator в ListView, но он не работает. Я пытался содержать listView с помощью Expanded, затем список отображался хорошо, но при вызове RefreshIndicator дамп приложения... кто-нибудь может мне помочь, как исправить этот код, спасибо

import 'dart:async';

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  List<int> items = List.generate(16, (i) => i);

  Future<Null> _handleRefresh() async {
    await Future.delayed(Duration(seconds: 5), () {
      print('refresh');
      setState(() {
        items.clear();
        items = List.generate(40, (i) => i);
        return null;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Refresh"),
        ),
        body:  Column(
          children: <Widget>[RefreshIndicator(child:
            ListView.builder(
              itemCount: items.length,
            shrinkWrap: true,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text("Index$index"),
                );
              },
             ), onRefresh: _handleRefresh,)
          ],
        )

        );
  }
}

почему вы использовали Column вместо простого Container ? у тебя только один ребенок

Tarek B 04.06.2019 13:55

это тест, в реальном приложении у меня есть серверный виджет в столбце

wenst 04.06.2019 13:58

Хорошо, я отправил ответ.

Tarek B 04.06.2019 14:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
4 070
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У меня два замечания:

  1. Вы должны использовать виджет Expanded с параметром flex.
  2. Вам не нужно return ничего делать в setState методе.
    import 'dart:async';
    import 'package:flutter/material.dart';
    void main() {
      runApp(new MaterialApp(
        home: new MyApp(),
      ));
    }

    class MyApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => MyAppState();
    }

    class MyAppState extends State<MyApp> {
      List<int> items = List.generate(16, (i) => i);

      Future<Null> _handleRefresh() async {
        await Future.delayed(Duration(seconds: 5), () {
          print('refresh');
          setState(() {
            items.clear();
            items = List.generate(40, (i) => i);
          });
        });
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Refresh"),
          ),
          body: Column(
            children: <Widget>[
              Expanded(
                flex: 1,
                child: RefreshIndicator(
                  child: ListView.builder(
                    itemCount: items.length,
                    shrinkWrap: true,
                    itemBuilder: (context, index) {
                      return ListTile(
                        title: Text("Index$index"),
                      );
                    },
                  ),
                  onRefresh: _handleRefresh,
                ),
              )
            ],
          ),
        );
      }
    }

Большое вам спасибо, это работает хорошо, поэтому причина в том, что мой расширенный файл помещен в неправильное место.

wenst 04.06.2019 14:25

Ответ выше (от Тарека База) правильный, однако в некоторых особых случаях (например, глубокое/сложное дерево виджетов) этого может быть недостаточно, и вам может потребоваться передать параметр физики в функцию ListView.builder().

ListView.builder( 
physics: const AlwaysScrollableScrollPhysics(), 
itemCount: .... ... ) 

спасибо, это решает мою проблему, когда у меня есть Container и ListView внутри столбца

Irfandi D. Vendy 23.02.2022 19:33

Другие вопросы по теме