Flutter Login API Request

Mohamad's interest is in Programming (Mobile, Web, Database and Machine Learning). He is studying at the Center For Artificial Intelligence Technology (CAIT), Universiti Kebangsaan Malaysia (UKM).
Continue from previous tutorial: https://hashnotes.hashnode.dev/flutter-home-and-login-page
[1] Edit Login Screen
[1.1] Create HTTP POST Request (Multi Part Request)
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:hive/hive.dart';
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
final Box _boxUser = Hive.box("user");
Future<void> _login() async {
final url = Uri.parse('https://demo.razzi.my/spotnet/public/api/login');
final request = http.MultipartRequest('POST', url);
request.fields['email'] = _emailController.text;
request.fields['password'] = _passwordController.text;
final response = await request.send();
final responseBody = await response.stream.bytesToString();
if (response.statusCode == 200) {
final data = jsonDecode(responseBody);
final email = data['email'];
final userToken = data['user_token'];
// Update the 'boxUser' box
await _boxUser.put('email', email);
await _boxUser.put('user_token', userToken);
// Handle the successful login response
print(data);
// Navigate to the home page
Navigator.pushReplacementNamed(context, '/home');
} else {
// Handle the login error
print('Login failed: $responseBody');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Login'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
),
),
SizedBox(height: 16.0),
TextField(
controller: _passwordController,
obscureText: true,
decoration: InputDecoration(
labelText: 'Password',
),
),
SizedBox(height: 16.0),
ElevatedButton(
onPressed: _login,
child: Text('Login'),
),
],
),
),
);
}
}