import 'package:flutter/material.dart';
import 'dart:math';
class DataFetchScreen extends StatefulWidget {
@override
State<DataFetchScreen> createState() => _DataFetchScreenState();
}
class _DataFetchScreenState extends State<DataFetchScreen> {
bool _isLoading = false;
bool _hasError = false;
String _data = '';
Future<void> _fetchData() async {
setState(() {
_isLoading = true;
_hasError = false;
_data = '';
});
await Future.delayed(Duration(seconds: 2));
bool success = Random().nextBool();
if (success) {
setState(() {
_isLoading = false;
_data = 'Here is the fetched data!';
});
} else {
setState(() {
_isLoading = false;
_hasError = true;
});
}
}
@override
void initState() {
super.initState();
_fetchData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Data Fetch Screen')),
body: Center(
child: _isLoading
? CircularProgressIndicator()
: _hasError
? Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Failed to load data.', style: TextStyle(color: Colors.red, fontSize: 16)),
SizedBox(height: 12),
ElevatedButton(
onPressed: _fetchData,
child: Text('Retry'),
),
],
)
: Text(_data, style: TextStyle(fontSize: 18)),
),
);
}
}
This screen uses a StatefulWidget to manage loading, error, and data states.
The _fetchData method simulates a network call with a 2-second delay. It randomly decides success or failure.
While loading, it shows a CircularProgressIndicator. If an error occurs, it shows a red error message and a Retry button. On success, it shows the fetched data text.
The Retry button calls _fetchData again to retry loading.