| // Copyright 2019-present the Flutter authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| import 'package:flutter/material.dart'; |
| |
| class LoginPage extends StatefulWidget { |
| @override |
| _LoginPageState createState() => _LoginPageState(); |
| } |
| |
| class _LoginPageState extends State<LoginPage> { |
| final TextEditingController _usernameController = TextEditingController(); |
| final TextEditingController _passwordController = TextEditingController(); |
| |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar( |
| elevation: 0, |
| leading: IconButton( |
| icon: const BackButtonIcon(), |
| tooltip: MaterialLocalizations.of(context).backButtonTooltip, |
| onPressed: () { |
| Navigator.of(context, rootNavigator: true).pop(); |
| }, |
| ), |
| ), |
| body: SafeArea( |
| child: GestureDetector( |
| onTap: () { |
| Navigator.pop(context); |
| }, |
| child: ListView( |
| padding: const EdgeInsets.symmetric(horizontal: 24), |
| children: <Widget>[ |
| Padding( |
| padding: const EdgeInsets.symmetric(vertical: 64), |
| child: SizedBox( |
| height: 160, |
| child: Image.asset( |
| 'logo.png', |
| package: 'rally_assets', |
| ), |
| ), |
| ), |
| TextField( |
| controller: _usernameController, |
| decoration: const InputDecoration( |
| labelText: 'Username', |
| ), |
| ), |
| const SizedBox(height: 12), |
| TextField( |
| controller: _passwordController, |
| decoration: const InputDecoration( |
| labelText: 'Password', |
| ), |
| obscureText: true, |
| ), |
| SizedBox( |
| height: 120, |
| child: Image.asset( |
| 'thumb.png', |
| package: 'rally_assets', |
| ), |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| } |
| |
| @override |
| void dispose() { |
| _usernameController.dispose(); |
| _passwordController.dispose(); |
| super.dispose(); |
| } |
| } |