// 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, Key key, }) : super(key: key); @override _SignInHttpDemoState 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( 'https://example.com/signin', body: json.encode(formData.toJson()), headers: {'content-type': 'application/json'}); if (result.statusCode == 200) { _showDialog('Successfully signed in.'); } else if (result.statusCode == 401) { _showDialog('Unable to sign in.'); } else { _showDialog('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(), ), ], ), ); } }