import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:mobile_nebula/components/SpecialTextField.dart'; import 'package:mobile_nebula/models/IPAndPort.dart'; import '../services/utils.dart'; import 'IPField.dart'; //TODO: Support initialValue class IPAndPortField extends StatefulWidget { const IPAndPortField({ Key? key, this.ipOnly = false, this.ipHelp = "ip address", this.autoFocus = false, this.focusNode, this.nextFocusNode, required this.onChanged, this.textInputAction, this.noBorder = false, this.ipTextAlign, this.ipController, this.portController, }) : super(key: key); final String ipHelp; final bool ipOnly; final bool autoFocus; final FocusNode? focusNode; final FocusNode? nextFocusNode; final ValueChanged onChanged; final TextInputAction? textInputAction; final bool noBorder; final TextAlign? ipTextAlign; final TextEditingController? ipController; final TextEditingController? portController; @override _IPAndPortFieldState createState() => _IPAndPortFieldState(); } //TODO: if the keyboard is open on the port field and you switch to dark mode, it crashes //TODO: maybe add in a next/done step for numeric keyboards //TODO: rig up focus node and next node //TODO: rig up textInputAction class _IPAndPortFieldState extends State { final _portFocus = FocusNode(); final _ipAndPort = IPAndPort(); @override void initState() { //TODO: this won't track external controller changes appropriately _ipAndPort.ip = widget.ipController?.text ?? ""; _ipAndPort.port = int.tryParse(widget.portController?.text ?? ""); super.initState(); } @override Widget build(BuildContext context) { var textStyle = CupertinoTheme.of(context).textTheme.textStyle; return Container( child: Row(children: [ Expanded( child: Padding( padding: EdgeInsets.fromLTRB(6, 6, 2, 6), child: IPField( help: widget.ipHelp, ipOnly: widget.ipOnly, nextFocusNode: _portFocus, textPadding: EdgeInsets.all(0), textInputAction: TextInputAction.next, focusNode: widget.focusNode, onChanged: (val) { _ipAndPort.ip = val; widget.onChanged(_ipAndPort); }, textAlign: widget.ipTextAlign, controller: widget.ipController, ))), Text(":"), Container( width: Utils.textSize("00000", textStyle).width + 12, padding: EdgeInsets.fromLTRB(2, 6, 6, 6), child: SpecialTextField( keyboardType: TextInputType.number, focusNode: _portFocus, nextFocusNode: widget.nextFocusNode, controller: widget.portController, onChanged: (val) { _ipAndPort.port = int.tryParse(val); widget.onChanged(_ipAndPort); }, maxLength: 5, inputFormatters: [FilteringTextInputFormatter.digitsOnly], textInputAction: TextInputAction.done, placeholder: 'port', )) ])); } @override void dispose() { _portFocus.dispose(); super.dispose(); } }