Contents
Outline
The pull to refresh
became the normal UI/UX in the app that has the list. In this blog post, I will introduce how to make the pull to refresh for updating the list in the Flutter app.
You can see the full source code in GitHub
.
RefreshIndicator
In Flutter, you need to use the RefreshIndicator
widget for the pull to refresh.
- Document: RefreshIndicator class
Next, let’s see how to use the RefreshIndicator
widget for the pull to refresh.
ListView
First, let’s make a normal list by using the ListView
widget.
class _MyHomePageState extends State<MyHomePage> {
final List<String> _list = ['Apple', 'Banana', "Strawberry", "Watermelon"];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('RefreshIndicator')),
body: ListView.builder(
itemCount: _list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_list[index]),
);
},
),
);
}
}
We’ll update the list by the RefreshIndicator
widget, so I use State Widget
in here.
After writing the code, you can see the ListView
widget is shown well like the following.
When you pull the list in this ListView
widget, you can see the upper area just extends and refreshing not occurs like the following.
How to use RefreshIndicator
Now, let’s implement the pull to refresh by using the RefreshIndicator
widget. The RefreshIndicator
widget has the onRefresh
function and child
like the following.
RefreshIndicator(
onRefresh: ...,
child: ...,
)
Let’s apply the RefreshIndicator
to the list screen that is implemented by the ListView
widget.
class _MyHomePageState extends State<MyHomePage> {
List<String> _list = ['Apple', 'Banana', "Strawberry", "Watermelon"];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('RefreshIndicator')),
body: RefreshIndicator(
onRefresh: () async {
setState(() {
_list = [..._list, ..._list];
});
},
child: ListView.builder(
itemCount: _list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_list[index]),
);
},
),
),
);
}
}
I used the RefreshIndicator
widget to the parent widget of the ListView
widget. In the onRefresh
function, I wrote the code to update the list.
After writing the code, you can see the list is shown well like the following.
When you pull the list, you can see the loading icon(Indicator) unlike before.
And then, when you release it, you can see the list is updated well.
Empty screen with no list data
If there is data to be displayed on the screen from the beginning, it can be implemented with only the method so far. However, if there is not data, you need to show the empty screen and use the SingleChildScrollView
widget with the AlwaysScrollableScrollPhysics
option to implement the pull to refresh.
class _MyHomePageState extends State<MyHomePage> {
List<String> _list = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('RefreshIndicator')),
body: RefreshIndicator(
onRefresh: () async {
final newList = ['Apple', 'Banana', "Strawberry", "Watermelon"];
setState(() {
_list = [..._list, ...newList];
});
},
child: _list.isNotEmpty
? ListView.builder(
itemCount: _list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_list[index]),
);
},
)
: LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SizedBox(
height: constraints.maxHeight,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('There is not data.'),
Text('Pull to refresh.'),
],
),
),
),
);
},
),
),
);
}
}
Let’s see the details of the code for no data.
LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SizedBox(
height: constraints.maxHeight,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('There is not data.'),
Text('Pull to refresh.'),
],
),
),
),
);
},
)
If you implement the SingleChildScrollView
widget with the AlwaysScrollableScrollPhysics
option, you can always scroll the screen regardless of the content size. Also, you can implement the empty screen with the LayoutBuilder
widget for the full screen when there is no data.
After modifying the code, you can see the screen like the following.
And then, when you pull the list, you can see the refresh icon.
And after releasing it, you can see the screen that the data is added on it.
Completed
Done! we’ve seen how to use the RefreshIndicator
widget to implement the pull to refresh. The pull to refresh feature is needed for the almost list screen, so if you remember it well, it will be great helpful to implement it.
Was my blog helpful? Please leave a comment at the bottom. it will be a great help to me!
App promotion
Deku
.Deku
created the applications with Flutter.If you have interested, please try to download them for free.