如何使RefreshIndicator消失?

问题描述 投票:0回答:2

我有这个代码,其中包含父窗口小部件Homepage和子窗口小部件CountryList。在CountryList中,我创建了一个使用API​​来获取国家/地区列表的函数。我觉得在应用程序中启用RefreshIndicator,所以我不得不修改Homepage小部件并添加GlobalKey来访问getCountryData()小部件的CountryList功能。 RefreshIndicator做得很好。但现在的问题是,当我在应用程序中拉动并使用RefreshIndicator时,会调用getCountryData()函数,但即使在显示列表中的所有数据之后,循环微调器也不会出现(如屏幕截图所示).App Screenshot

所以,有人可以建议我让旋转器去的方法吗?包含main.dart小部件的Homepage代码如下:

import 'package:flutter/material.dart';
import 'country_list.dart';
GlobalKey<dynamic> globalKey = GlobalKey();

void main() => runApp(MaterialApp(home: Homepage()));

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("List of countries"), actions: <Widget>[
        IconButton(icon: Icon(Icons.favorite), onPressed: (){},)
      ],),
      body: RefreshIndicator(child: CountryList(key:globalKey), onRefresh: (){globalKey.currentState.getCountryData();},),
    );
  }
}

包含country_list.dart小部件的CountryList的代码是:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter_svg/flutter_svg.dart';
class CountryList extends StatefulWidget {
  CountryList({Key key}) : super(key: key);
  @override
  _CountryListState createState() => _CountryListState();
}

class _CountryListState extends State<CountryList> {
  List<dynamic> _countryData;
  bool _loading = false;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    this.getCountryData();
  }

  Future<String> getCountryData() async {
    setState(() {
      _loading = true;
    });
    var response =
        await http.get(Uri.encodeFull("https://restcountries.eu/rest/v2/all"));
    var decodedResponse = json.decode(response.body);
    setState(() {
      _countryData = decodedResponse;
      _loading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _loading?Center(child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[CircularProgressIndicator(), Padding(padding: EdgeInsets.all(5.0),), Text("Loading data...", style: TextStyle(fontSize: 20.0),)],)):ListView.builder(
      itemCount: _countryData.length,
      itemBuilder: (BuildContext context, int index) {
        return Card(
          child: ListTile(
            leading: SvgPicture.network(_countryData[index]['flag'], width: 60.0,),
            title: Text(_countryData[index]['name']),
            trailing: IconButton(
              icon: Icon(Icons.favorite_border),
              onPressed: () {},
            ),
          ),
        );
      },
    );
  }
}
dart flutter
2个回答
0
投票

你需要在这里添加return

Future<String> getCountryData() async {
    setState(() {
      _loading = true;
    });
    var response =
        await http.get(Uri.encodeFull("https://restcountries.eu/rest/v2/all"));
    var decodedResponse = json.decode(response.body);
    setState(() {
      _countryData = decodedResponse;
      _loading = false;
    });

    return 'success';
    }

和这里:

body: RefreshIndicator(
    child: CountryList(key: globalKey),
    onRefresh: () {
      return globalKey.currentState.getCountryData();
    },
  ),

0
投票

调用onRefresh回调。回调应该更新可滚动的内容,然后完成它返回的Future。回调的Future完成后刷新指示消失,我认为你应该从Future<String>返回getCountryData

© www.soinside.com 2019 - 2024. All rights reserved.