import 'package:comunic/utils/intl_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// Dialog to use to ask the user to enter a value /// /// @author Pierre Hubert class SingleInputDialog extends StatefulWidget { final String title; final IconData icon; final String initialValue; final String label; final bool Function(String) checkInput; final String errorMessage; final bool canBeEmpty; final int maxLines; final int maxLength; const SingleInputDialog({ Key key, @required this.title, @required this.icon, @required this.initialValue, @required this.label, @required this.checkInput, @required this.errorMessage, this.canBeEmpty = false, this.maxLines = 1, this.maxLength, }) : assert(title != null), assert(label != null), assert(checkInput != null), assert(errorMessage != null), assert(maxLines != null), super(key: key); @override __InputURLDialogState createState() => __InputURLDialogState(); } class __InputURLDialogState extends State { TextEditingController _controller; bool get _isValid => (_controller.text.isEmpty && widget.canBeEmpty) || (_controller.text.isNotEmpty && widget.checkInput(_controller.text)); @override void initState() { super.initState(); _controller = new TextEditingController(text: widget.initialValue); } @override Widget build(BuildContext context) { return AlertDialog( title: Text(widget.title), content: TextField( controller: _controller, onChanged: (s) => setState(() {}), maxLines: widget.maxLines, maxLength: widget.maxLength, decoration: InputDecoration( icon: widget.icon == null ? null : Icon(widget.icon), alignLabelWithHint: true, labelText: widget.label, errorText: _controller.text.isNotEmpty && !_isValid ? widget.errorMessage : null, ), ), actions: [ // Cancel MaterialButton( child: Text(tr("Cancel").toUpperCase()), onPressed: () => Navigator.of(context).pop(), textColor: Colors.red, ), // Confirm MaterialButton( child: Text(tr("Confirm").toUpperCase()), onPressed: _isValid ? () => Navigator.of(context).pop(_controller.text) : null, ), ], ); } }