0

我正在构建的应用程序使用 Cupertino Picker,它显示要选择的项目列表,在本例中是美国各州的名称。第一项默认为列表中的第一项('ak'),当按下选择该项的按钮时,应用程序会出错。仅当未滚动时,这才发生在第一项时。如果选择器被滚动并且用户返回到第一个项目,它工作正常。

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,
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
4

1 回答 1

0

我已经重新创建了您的问题,但没有看到任何错误。 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,
    );
于 2021-03-26T20:04:32.987 回答