// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

import 'text_field_constants.dart';

export 'text_field_constants.dart';

/// A page with a normal text field and a password field.
class TextFieldPage extends StatefulWidget {
  const TextFieldPage({super.key});

  @override
  State<StatefulWidget> createState() => _TextFieldPageState();
}

class _TextFieldPageState extends State<TextFieldPage> {
  final TextEditingController _normalController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();
  final Key backButtonKey = const ValueKey<String>(backButtonKeyValue);
  final Key normalTextFieldKey = const ValueKey<String>(normalTextFieldKeyValue);
  final Key passwordTextFieldKey = const ValueKey<String>(passwordTextFieldKeyValue);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(leading: BackButton(key: backButtonKey)),
      body: Material(
        child: Column(children: <Widget>[
          TextField(
            key: normalTextFieldKey,
            controller: _normalController,
          ),
          const Spacer(),
          TextField(
            key: passwordTextFieldKey,
            controller: _passwordController,
            obscureText: true,
          ),
        ],
      ),
    ));
  }
}
