RefreshIndicator не работает с SingleChildScrollView как дочерний элемент - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь использовать RefreshIndicator для перезагрузки списка, который я показываю на главном экране. Код выглядит примерно так:

class Home extends StatefulWidget {
  @override
  _StartHomeState createState() => _StartHomeState();
}

class _StartHomeState extends State<Home> {
  EventsList events;

  @override
  void initState() {
    super.initState();
    events = EventsList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      body: RefreshIndicator(
        onRefresh: resfreshEventList,
        child: SingleChildScrollView(
          physics: AlwaysScrollableScrollPhysics(),
          child: Column(
            children: [
              HomeTopBar(),
              events,
            ],
          ),
        ),
      ),
    );
  }

  Future<Null> resfreshEventList() async {
    await Future.delayed(Duration(seconds: 2));

    setState(() {
      events = EventsList();
    });
    return null;
  }
}

EventsList - это еще один виджет с отслеживанием состояния, который вызывает API и отображает ответ на список виджетов. Я попытался установить свойство physics для SingleChildScrollView, как упоминалось здесь: https://github.com/flutter/flutter/issues/22180, но не повезло. Использование ListView вместо SingleChildScrollView тоже не работает.

1 Ответ

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

Кажется, что в этом примере все работает нормально. Когда я нажимаю refre sh, запускается resfreshEventList, а также setState работает без проблем.

Вот код, который я использую:

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  @override
  _StartHomeState createState() => _StartHomeState();
}

class _StartHomeState extends State<Home> {
  // EventsList events;
  int number = 0;

  @override
  // void initState() {
  //   super.initState();
  //   events = EventsList();
  // }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(
        title: Text("RefreshIndicator Example"),
      ),
      resizeToAvoidBottomPadding: false,
      body: RefreshIndicator(
        onRefresh: resfreshEventList,
        child: SingleChildScrollView(
          physics: AlwaysScrollableScrollPhysics(),
          child: Column(
            children: [
              // HomeTopBar(),
              // events,
              Container(
                height: 200,
                width: 200,
                color: Colors.red,
                child: Center(
                  child: Text(number.toString()),
                ),
              ),
              Divider(),
              Container(
                height: 200,
                width: 200,
                color: Colors.red,
                child: Center(
                  child: Text(number.toString()),
                ),
              ),
              Divider(),
              Container(
                height: 200,
                width: 200,
                color: Colors.red,
                child: Center(
                  child: Text(number.toString()),
                ),
              ),
              Divider(),
              Container(
                height: 200,
                width: 200,
                color: Colors.red,
                child: Center(
                  child: Text(number.toString()),
                ),
              ),
              Divider(),
              Container(
                height: 200,
                width: 200,
                color: Colors.red,
                child: Center(
                  child: Text(number.toString()),
                ),
              )
            ],
          ),
        ),
      ),
    ));
  }

  Future<Null> resfreshEventList() async {
    // await Future.delayed(Duration(seconds: 2));

    // setState(() {
    //   events = EventsList();
    // });
    setState(() {
      number = number + 1;
    });
    print("Refresh Pressed");
    return null;
  }
}

Вывод:

enter image description here

...