// Copyright 2020, the Flutter project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:json_annotation/json_annotation.dart'; part 'sign_in_http.g.dart'; @JsonSerializable() class FormData { String? email; String? password; FormData({this.email, this.password}); factory FormData.fromJson(Map json) => _$FormDataFromJson(json); Map toJson() => _$FormDataToJson(this); } class SignInHttpDemo extends StatefulWidget { final http.Client? httpClient; const SignInHttpDemo({this.httpClient, super.key}); @override State createState() => _SignInHttpDemoState(); } class _SignInHttpDemoState extends State { FormData formData = FormData(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Sign in Form')), body: Form( child: Scrollbar( child: SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( children: [ ...[ TextFormField( autofocus: true, textInputAction: TextInputAction.next, decoration: const InputDecoration( filled: true, hintText: 'Your email address', labelText: 'Email', ), onChanged: (value) { formData.email = value; }, ), TextFormField( decoration: const InputDecoration( filled: true, labelText: 'Password', ), obscureText: true, onChanged: (value) { formData.password = value; }, ), TextButton( child: const Text('Sign in'), onPressed: () async { // Use a JSON encoded string to send var result = await widget.httpClient!.post( Uri.parse('https://example.com/signin'), body: json.encode(formData.toJson()), headers: {'content-type': 'application/json'}, ); _showDialog(switch (result.statusCode) { 200 => 'Successfully signed in.', 401 => 'Unable to sign in.', _ => 'Something went wrong. Please try again.', }); }, ), ].expand((widget) => [widget, const SizedBox(height: 24)]), ], ), ), ), ), ); } void _showDialog(String message) { showDialog( context: context, builder: (context) => AlertDialog( title: Text(message), actions: [ TextButton( child: const Text('OK'), onPressed: () => Navigator.of(context).pop(), ), ], ), ); } }