问题描述
我正在构建的应用程序使用 Cupertino Picker 显示要选择的项目列表,在本例中为美国各州的名称。第一个项目默认为列表中的第一个项目('ak'),当按下选择项目的按钮时,应用程序出错。 This only happens with the first item,when the picker isn't scrolled.如果滚动选择器并且用户返回到第一项,则它工作正常。
class StateSelectScreen extends StatefulWidget {
static const String id = 'state_select_screen';
@override
_StateSelectScreenState createState() => _StateSelectScreenState();
}
class _StateSelectScreenState extends State<StateSelectScreen> {
String selectedState = 'ak';
bool showSpinner = false;
DropdownButton<String> androidDropdown() {
List<DropdownMenuItem<String>> dropdownItems = [];
for (String state in statesList) {
var newItem = DropdownMenuItem(
child: Text(
Usstates.getName(state).toupperCase(),textAlign: TextAlign.center,),value: state,);
dropdownItems.add(newItem);
}
return DropdownButton<String>(
dropdownColor: Colors.black26,autofocus: true,focusColor: Colors.black26,style: TextStyle(
fontSize: k30PointFont,value: selectedState,items: dropdownItems,onChanged: (value) {
setState(() {
selectedState = value;
getStateData();
});
},);
}
Cupertinopicker iOSPicker() {
List<Text> pickerItems = [];
for (String state in statesList) {
pickerItems.add(Text(Usstates.getName(state.toupperCase())));
}
return Cupertinopicker(
backgroundColor: kCupertinopickerBackgroundColor,itemExtent: kCupertinopickerItemExtent,onselecteditemchanged: (selectedindex) {
setState(() {
selectedState = Usstates.getName(statesList[selectedindex]);
getStateData();
});
},children: pickerItems,);
}
Map<String,dynamic> selectedStateData = {};
bool isWaiting = false;
void getStateData() async {
isWaiting = true;
try {
var stateData = await GetData().getStateData(selectedState);
isWaiting = false;
setState(() {
selectedStateData = stateData;
});
} catch (e) {
print(e);
}
}
@override
void initState() {
super.initState();
getStateData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(kAppBarTitle),body: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[
Flexible(
child: Padding(
padding: EdgeInsets.only(top: kStateSelectScreenFlexEdgeInsetsTop,bottom: kStateSelectScreenFlexEdgeBottom),child: Hero(
tag: kHeroTag,child: Container(
height: 200.0,child: Image.asset(kHeroImageAsset),Container(
child: Column(
children: <Widget>[
Container(
height: kStateSelectScreenContainerHeight,alignment: Alignment.center,padding: EdgeInsets.only(bottom: kStateSelectScreenContainerPaddingBottom),child: Platform.isIOS ? iOSPicker() : androidDropdown(),BottomButton(
onpressed: () {
Navigator.push(
context,MaterialPageRoute(
builder: (context) {
return ResultsScreen(
covidData: selectedStateData,location: selectedState,);
},);
},buttonTitle: kCheckStateResultsButtonTitle,SizedBox(
height: kHeight15,BottomButton(
onpressed: () {
Navigator.pushNamed(context,MenuScreen.id);
},buttonTitle: kMainMenuButtonTitle,],);
}
}
解决方法
我重新创建了您的问题,但没有看到任何错误。 https://codepen.io/flakerimi/pen/poRywLZ
你说when the button to select the item is pressed,the app errors out.
哪个按钮?没看到
我已经添加了 scrollController: FixedExtentScrollController(initialItem: 1),
,但我认为情况并非如此。
return CupertinoPicker(
scrollController: FixedExtentScrollController(initialItem: 1),backgroundColor: Colors.white,itemExtent: 30,onSelectedItemChanged: (selectedIndex) {
setState(() {
selectedState = statesList[selectedIndex];
print(selectedState);
});
},children: pickerItems,);