Skip to content

Instantly share code, notes, and snippets.

@suragch
Last active May 26, 2021 02:03
Show Gist options
  • Save suragch/7980ff4e8b61f39c15622d53fddc3a29 to your computer and use it in GitHub Desktop.
Save suragch/7980ff4e8b61f39c15622d53fddc3a29 to your computer and use it in GitHub Desktop.
HTTP requests in Flutter
import 'package:flutter/material.dart';
import 'package:http_request_demo/state_management.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: HomePage(),
),
);
}
}
class HomePage extends StatelessWidget {
final stateManager = HomePageManager();
@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(height: 50),
Center(
child: Wrap(
spacing: 50,
alignment: WrapAlignment.center,
children: [
ElevatedButton(
onPressed: stateManager.makeGetRequest,
child: Text('GET'),
),
ElevatedButton(
onPressed: stateManager.makePostRequest,
child: Text('POST'),
),
ElevatedButton(
onPressed: stateManager.makePutRequest,
child: Text('PUT'),
),
ElevatedButton(
onPressed: stateManager.makePatchRequest,
child: Text('PATCH'),
),
ElevatedButton(
onPressed: stateManager.makeDeleteRequest,
child: Text('DELETE'),
),
],
),
),
SizedBox(height: 20),
ValueListenableBuilder<RequestState>(
valueListenable: stateManager.resultNotifier,
builder: (context, requestState, child) {
if (requestState is RequestLoadInProgress) {
return CircularProgressIndicator();
} else if (requestState is RequestLoadSuccess) {
return Expanded(child: SingleChildScrollView(child: Text(requestState.body)));
} else {
return Container();
}
},
),
],
);
}
}
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
class HomePageManager {
final resultNotifier = ValueNotifier<RequestState>(RequestInitial());
static const urlPrefix = 'https://jsonplaceholder.typicode.com';
Future<void> makeGetRequest() async {
resultNotifier.value = RequestLoadInProgress();
final url = Uri.parse('$urlPrefix/posts');
Response response = await get(url);
print('Status code: ${response.statusCode}');
print('Headers: ${response.headers}');
print('Body: ${response.body}');
_handleResponse(response);
}
Future<void> makePostRequest() async {
resultNotifier.value = RequestLoadInProgress();
final url = Uri.parse('$urlPrefix/posts');
final headers = {"Content-type": "application/json"};
final json = '{"title": "Hello", "body": "body text", "userId": 1}';
final response = await post(url, headers: headers, body: json);
print('Status code: ${response.statusCode}');
print('Body: ${response.body}');
_handleResponse(response);
}
Future<void> makePutRequest() async {
resultNotifier.value = RequestLoadInProgress();
final url = Uri.parse('$urlPrefix/posts/1');
final headers = {"Content-type": "application/json"};
final json = '{"title": "Hello", "body": "body text", "userId": 1}';
final response = await put(url, headers: headers, body: json);
print('Status code: ${response.statusCode}');
print('Body: ${response.body}');
_handleResponse(response);
}
Future<void> makePatchRequest() async {
resultNotifier.value = RequestLoadInProgress();
final url = Uri.parse('$urlPrefix/posts/1');
final headers = {"Content-type": "application/json"};
final json = '{"title": "Hello"}';
final response = await patch(url, headers: headers, body: json);
print('Status code: ${response.statusCode}');
print('Body: ${response.body}');
_handleResponse(response);
}
Future<void> makeDeleteRequest() async {
resultNotifier.value = RequestLoadInProgress();
final url = Uri.parse('$urlPrefix/posts/1');
final response = await delete(url);
print('Status code: ${response.statusCode}');
print('Body: ${response.body}');
_handleResponse(response);
}
void _handleResponse(Response response) {
if (response.statusCode >= 400) {
resultNotifier.value = RequestLoadFailure();
} else {
resultNotifier.value = RequestLoadSuccess(response.body);
}
}
}
class RequestState {
const RequestState();
}
class RequestInitial extends RequestState {}
class RequestLoadInProgress extends RequestState {}
class RequestLoadSuccess extends RequestState {
const RequestLoadSuccess(this.body);
final String body;
}
class RequestLoadFailure extends RequestState {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment