Вы можете скопировать и вставить полный код ниже
Рабочая демонстрация имитирует 3-секундную задержку сети и показывает случайное число
Шаг 1: позвоните setState
в IconButton
s onPressed
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
setState(() {});
},
),
Шаг 2: В didUpdateWidget
из _EventListState
используйте addPostFrameCallback
для вызова getEventList()
@override
void didUpdateWidget(EventList oldWidget) {
super.didUpdateWidget(oldWidget);
WidgetsBinding.instance.addPostFrameCallback((_) {
getEventList();
});
}
рабочая демонстрация
введите описание изображения здесь
Последовательность выполнения при нажатии refre sh кнопка
didUpdateWidget
build
getEventList
build for clear EventList
build for add EventList
полный код
import 'package:flutter/material.dart';
import 'dart:math';
class Event {
String title;
Event({this.title});
}
class HomeScreen extends StatefulWidget {
static String id = 'home_screen';
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: <Widget>[
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
setState(() {});
},
),
],
),
body: Column(children: <Widget>[
EventList(),
]));
}
}
class EventList extends StatefulWidget {
@override
_EventListState createState() => _EventListState();
}
class _EventListState extends State<EventList> {
List<Event> eventList = [];
@override
void initState() {
super.initState();
getEventList();
}
@override
void didUpdateWidget(EventList oldWidget) {
super.didUpdateWidget(oldWidget);
WidgetsBinding.instance.addPostFrameCallback((_) {
getEventList();
});
}
Future<Null> getEventList() async {
Random random = new Random();
setState(() {
eventList.clear();
});
await Future.delayed(Duration(seconds: 3), () {});
List<Event> newEventList = List<Event>.generate(
3, (index) => Event(title: random.nextInt(100).toString()));
setState(() {
eventList.addAll(newEventList);
});
}
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
child: (eventList == null || eventList.length == 0)
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: (eventList == null) ? 0 : eventList.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(title: Text(eventList[index].title));
})));
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomeScreen(),
);
}
}