如何解决我的FlatButton恰好在我的文本字段下方,并且每当出现键盘时都会被隐藏
我的平面按钮就在我的文本框下方。每当我的键盘弹出时,flatbutton就会被隐藏。我希望我的键盘一弹出,我的flatbutton也应该随之弹出。如果文本框上方的内容隐藏在上方或滚动上方,我没有问题。您可以检查代码的最后一部分以供参考-
//library international_phone_input;
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:international_phone_input/src/phone_service.dart';
import 'country.dart';
import 'package:byteseal/components/bottom_button.dart';
import 'package:byteseal/screens/otp_screen1.dart';
class InternationalPhoneInput extends StatefulWidget {
final void Function(String phoneNumber,String internationalizedPhoneNumber,String isoCode) onPhoneNumberChange;
final String initialPhoneNumber;
final String initialSelection;
final String errorText;
final String hintText;
final String labelText;
final TextStyle errorStyle;
final TextStyle hintStyle;
final TextStyle labelStyle;
final int errorMaxLines;
final List<String> enabledCountries;
final InputDecoration decoration;
final bool showCountryCodes;
final bool showCountryFlags;
final Widget dropdownIcon;
final InputBorder border;
bool isVisible = false;
InternationalPhoneInput(
{this.onPhoneNumberChange,this.initialPhoneNumber,this.initialSelection,this.errorText,this.hintText,this.labelText,this.errorStyle,this.hintStyle,this.labelStyle,this.enabledCountries = const [],this.errorMaxLines,this.decoration,this.showCountryCodes = true,this.showCountryFlags = true,this.dropdownIcon,//this.isVisible,this.border});
static Future<String> internationalizeNumber(String number,String iso) {
return PhoneService.getNormalizedPhoneNumber(number,iso);
}
@override
_InternationalPhoneInputState createState() =>
_InternationalPhoneInputState();
}
class _InternationalPhoneInputState extends State<InternationalPhoneInput> {
Country selectedItem;
List<Country> itemList = [];
String errorText;
String hintText;
String labelText;
TextStyle errorStyle;
TextStyle hintStyle;
TextStyle labelStyle;
int errorMaxLines;
bool hasError = false;
bool showCountryCodes;
bool showCountryFlags;
InputDecoration decoration;
Widget dropdownIcon;
InputBorder border;
_InternationalPhoneInputState();
final phoneTextController = TextEditingController();
@override
void initState() {
errorText = widget.errorText ?? 'Please enter a valid phone number';
hintText = widget.hintText ?? 'eg. 244056345';
labelText = widget.labelText;
errorStyle = widget.errorStyle;
hintStyle = widget.hintStyle;
labelStyle = widget.labelStyle;
errorMaxLines = widget.errorMaxLines;
decoration = widget.decoration;
showCountryCodes = widget.showCountryCodes;
showCountryFlags = widget.showCountryFlags;
dropdownIcon = widget.dropdownIcon;
phoneTextController.addListener(_validatePhoneNumber);
phoneTextController.text = widget.initialPhoneNumber;
_fetchCountryData().then((list) {
Country preSelectedItem;
if (widget.initialSelection != null) {
preSelectedItem = list.firstWhere(
(e) =>
(e.code.toUpperCase() ==
widget.initialSelection.toUpperCase()) ||
(e.dialCode == widget.initialSelection.toString()),orElse: () => list[0]);
} else {
preSelectedItem = list[0];
}
setState(() {
itemList = list;
selectedItem = preSelectedItem;
});
});
super.initState();
}
_validatePhoneNumber() {
String phoneText = phoneTextController.text;
if (phoneText != null && phoneText.isNotEmpty) {
PhoneService.parsePhoneNumber(phoneText,selectedItem.code)
.then((isValid) {
setState(() {
hasError = !isValid;
});
if (widget.onPhoneNumberChange != null) {
if (isValid) {
PhoneService.getNormalizedPhoneNumber(phoneText,selectedItem.code)
.then((number) {
widget.onPhoneNumberChange(phoneText,number,selectedItem.code);
});
} else {
widget.onPhoneNumberChange('','',selectedItem.code);
}
}
});
}
}
Future<List<Country>> _fetchCountryData() async {
var list = await DefaultAssetBundle.of(context)
.loadString('packages/international_phone_input/assets/countries.json');
List<dynamic> jsonList = json.decode(list);
List<Country> countries = List<Country>.generate(jsonList.length,(index) {
Map<String,String> elem = Map<String,String>.from(jsonList[index]);
if (widget.enabledCountries.isEmpty) {
return Country(
name: elem['en_short_name'],code: elem['alpha_2_code'],dialCode: elem['dial_code'],flagUri: 'assets/flags/${elem['alpha_2_code'].toLowerCase()}.png');
} else if (widget.enabledCountries.contains(elem['alpha_2_code']) ||
widget.enabledCountries.contains(elem['dial_code'])) {
return Country(
name: elem['en_short_name'],flagUri: 'assets/flags/${elem['alpha_2_code'].toLowerCase()}.png');
} else {
return null;
}
});
countries.removeWhere((value) => value == null);
return countries;
}
int sum = 0;
String isonum;
bool isVisible = false;
bool visibility() {
return isVisible;
}
String pno;
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children : <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[
DropdownButtonHideUnderline(
child: Padding(
padding: EdgeInsets.only(top: 8),child: DropdownButton<Country>(
value: selectedItem,icon: Padding(
padding:
EdgeInsets.only(bottom: (decoration != null) ? 6 : 0),child: dropdownIcon ?? Icon(Icons.arrow_drop_down),),onChanged: (Country newValue) {
setState(() {
selectedItem = newValue;
});
_validatePhoneNumber();
},items: itemList.map<DropdownMenuItem<Country>>((Country value) {
return DropdownMenuItem<Country>(
value: value,child: Container(
padding: const EdgeInsets.only(bottom: 5.0),child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[
if (showCountryFlags) ...[
Image.asset(
value.flagUri,width: 32.0,package: 'international_phone_input',)
],if (showCountryCodes) ...[
SizedBox(width: 4),Text(value.dialCode,style: TextStyle(color: Colors.white),)
]
],);
}).toList(),Flexible(
child: GestureDetector(
child: TextField(
onChanged: (text){
sum+=1;
setState(() {
if(sum>9) {
isVisible=true;
}
});
},onSubmitted: (text) {
pno = text;
},keyboardType: TextInputType.phone,style: TextStyle(
color: Colors.white,controller: phoneTextController,decoration: decoration ??
InputDecoration(
hintText: hintText,labelText: labelText,errorText: hasError ? errorText : null,hintStyle: hintStyle ?? null,errorStyle: errorStyle ?? null,labelStyle: labelStyle,errorMaxLines: errorMaxLines ?? 3,border: border ?? null,)
)
],Padding(
padding: EdgeInsets.symmetric(horizontal: 10.0),child: Container(
height: 1.0,width: 360.0,color: Colors.white,Visibility(
visible: isVisible,child: BottomButton(
buttonTitle: 'Next',onTap: () {
Navigator.push(
context,MaterialPageRoute(
builder: (context) => OTPScreen(number: pno,iso: isonum),)
);
}),]
)
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。