189 lines
6.3 KiB
Dart
189 lines
6.3 KiB
Dart
import 'package:aitrainer_app/util/trans.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:google_fonts/google_fonts.dart';
|
|
import 'package:keyboard_actions/keyboard_actions.dart';
|
|
|
|
/// Dialog for input any data and call of an [Event] of a [Bloc]
|
|
class InputDialog<Event> extends StatefulWidget {
|
|
final ValueChanged<dynamic> onChanged;
|
|
|
|
final double initialValue;
|
|
|
|
/// Dialog title
|
|
final String title;
|
|
|
|
final String subtitle;
|
|
|
|
const InputDialog({this.onChanged, this.initialValue, this.title, this.subtitle});
|
|
|
|
@override
|
|
_InputDialogState<Event> createState() => _InputDialogState<Event>();
|
|
}
|
|
|
|
class _InputDialogState<Event> extends State<InputDialog<Event>> with Trans {
|
|
final FocusNode _nodeText1 = FocusNode();
|
|
double inputValue = 0;
|
|
|
|
KeyboardActionsConfig _buildConfig(BuildContext context) {
|
|
setContext(context);
|
|
return KeyboardActionsConfig(
|
|
keyboardActionsPlatform: KeyboardActionsPlatform.ALL,
|
|
keyboardBarColor: Colors.grey[200],
|
|
keyboardSeparatorColor: Colors.black26,
|
|
nextFocus: true,
|
|
actions: [
|
|
KeyboardActionsItem(
|
|
focusNode: _nodeText1,
|
|
toolbarButtons: [
|
|
//button 2
|
|
(node) {
|
|
return GestureDetector(
|
|
onTap: () => node.unfocus(),
|
|
child: Container(
|
|
color: Colors.orange,
|
|
padding: EdgeInsets.all(8.0),
|
|
child: Text(
|
|
t("Done"),
|
|
style: TextStyle(color: Colors.white),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Dialog(
|
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
|
|
elevation: 0,
|
|
backgroundColor: Colors.transparent,
|
|
child: _buildChild(context),
|
|
);
|
|
}
|
|
|
|
_buildChild(BuildContext context) => Container(
|
|
height: 350,
|
|
decoration: BoxDecoration(color: Colors.white60, shape: BoxShape.rectangle, borderRadius: BorderRadius.all(Radius.circular(12))),
|
|
child: KeyboardActions(
|
|
config: _buildConfig(context),
|
|
child: Column(
|
|
children: <Widget>[
|
|
Container(
|
|
padding: const EdgeInsets.all(12.0),
|
|
child: Column(children: [
|
|
Text(
|
|
widget.title,
|
|
style: GoogleFonts.archivoBlack(
|
|
shadows: <Shadow>[
|
|
Shadow(
|
|
offset: Offset(3.0, 3.0),
|
|
blurRadius: 3.0,
|
|
color: Colors.black54,
|
|
),
|
|
],
|
|
fontSize: 25,
|
|
color: Colors.orange[500],
|
|
),
|
|
),
|
|
Text(
|
|
widget.subtitle,
|
|
style: GoogleFonts.archivoBlack(
|
|
shadows: <Shadow>[
|
|
Shadow(
|
|
offset: Offset(3.0, 3.0),
|
|
blurRadius: 3.0,
|
|
color: Colors.black54,
|
|
),
|
|
],
|
|
fontSize: 30,
|
|
color: Colors.orange[500],
|
|
),
|
|
),
|
|
]),
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
color: Colors.white70,
|
|
shape: BoxShape.rectangle,
|
|
borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12))),
|
|
),
|
|
SizedBox(
|
|
height: 8,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(top: 20, right: 16, left: 16),
|
|
child: Text(
|
|
t("Please type the following data:"),
|
|
style: GoogleFonts.inter(fontSize: 16, color: Colors.yellow[200], shadows: <Shadow>[
|
|
Shadow(
|
|
offset: Offset(2.0, 2.0),
|
|
blurRadius: 3.0,
|
|
color: Colors.black54,
|
|
)
|
|
]),
|
|
textAlign: TextAlign.center,
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 24,
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 90, right: 90),
|
|
child: TextFormField(
|
|
focusNode: _nodeText1,
|
|
decoration: InputDecoration(
|
|
contentPadding: EdgeInsets.only(left: 15, top: 5, bottom: 5),
|
|
labelText: widget.subtitle,
|
|
labelStyle: GoogleFonts.inter(fontSize: 16, color: Colors.yellow[50]),
|
|
fillColor: Colors.black38,
|
|
filled: true,
|
|
border: OutlineInputBorder(
|
|
gapPadding: 2.0,
|
|
borderRadius: BorderRadius.circular(12.0),
|
|
borderSide: BorderSide(color: Colors.white12, width: 0.4),
|
|
),
|
|
),
|
|
initialValue: widget.initialValue.toStringAsFixed(0),
|
|
keyboardType: TextInputType.numberWithOptions(decimal: true),
|
|
textInputAction: TextInputAction.done,
|
|
style: GoogleFonts.archivoBlack(fontSize: 20, color: Colors.yellow[300]),
|
|
onChanged: (value) => this.inputValue = double.parse(value),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 24,
|
|
),
|
|
Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: <Widget>[
|
|
RaisedButton(
|
|
onPressed: () {
|
|
Navigator.of(context).pop();
|
|
},
|
|
child: Text(t('Cancel')),
|
|
color: Colors.black26,
|
|
textColor: Colors.white,
|
|
),
|
|
SizedBox(
|
|
width: 8,
|
|
),
|
|
RaisedButton(
|
|
onPressed: () {
|
|
widget.onChanged(this.inputValue);
|
|
return Navigator.of(context).pop(true);
|
|
},
|
|
child: Text(t('Save')),
|
|
color: Colors.orange[600],
|
|
textColor: Colors.white,
|
|
)
|
|
],
|
|
)
|
|
],
|
|
),
|
|
));
|
|
}
|