【问题标题】:setState is not working with DropDown Button in FluttersetState 不适用于 Flutter 中的下拉按钮
【发布时间】:2019-07-21 01:19:48
【问题描述】:

当我从下拉列表中选择数量时,我正在根据数量计算总计,但总量Textformfield 保持不变,当我调试代码时,我在setState 方法中获得更新的数量,但没有反映用户界面,我还在该方法中从另一个方法更新总数。

 class _ProductDetailsPageState extends State<ProductDetailsPage> {


  List _quantity = ["1", "2", "3", "4", "5"];
  List<DropdownMenuItem<String>> _dropDownQuantity;

  String _currentQuantity;
  String _productprice;
  double _taxrateamt;
  double _taxper = 0.0;
  String _producttotal;
  int _productqty;
  double _discount = 3.0;
  String _productname;

  List<DropdownMenuItem<String>> getDropDownQuantity() {
    List<DropdownMenuItem<String>> items = new List();
    for (String city in _quantity) {
      items.add(new DropdownMenuItem(
          value: city,
          child: new Text(
            city,
            style:
                TextStyle(color: MyColors.colorPrimary, fontFamily: 'semibold'),
          )));
    }
    return items;
  }

  @override
  void initState() {
    super.initState();

    _dropDownQuantity = getDropDownQuantity();
    _currentQuantity = _dropDownQuantity[0].value;
  }

  Container rateAndTotal( String value) {
    return Container(
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                flex: 1,
                child: Container(
                  child: TextFormField(
                    style: TextStyle(
                        fontFamily: 'medium', color: MyColors.colorPrimaryDark),
                    keyboardType: TextInputType.number,
                    enabled: false,
                    textInputAction: TextInputAction.done,
                    initialValue: '${value}',
                    decoration: InputDecoration(
                        border: InputBorder.none, hintText: '$value'),),),),],),],),);}

  Container quantity() {
    return Container(
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                flex:1,
                child: Container(
                     child: DropdownButtonHideUnderline(
                      child: DropdownButton(
                        value: _currentQuantity,
                        items: _dropDownQuantity,
                        onChanged: changedDropDownQuantity,),)),),],),],),);}

  @override
  Widget build(BuildContext context) {

        MediaQueryData queryData;
        queryData = MediaQuery.of(context);
        double width = queryData.size.width;
        double height = queryData.size.height;

        return new Container(
          height: double.infinity,
          decoration: BoxDecoration(color: Colors.grey[200]),
          child: SingleChildScrollView(
            child: Container(
              padding: EdgeInsets.all(height * 0.020),
              child: Column(
                children: <Widget>[
                  quantity(),
                  rateAndTotal( '${_productprice}'),
                ],
              ),
            ),
          ),
        );
  }

  void changedDropDownQuantity(String selected_quantity) {
    setState(() {
      _currentQuantity = selected_quantity;
      // _producttotal=getProductTotal(_productprice,_currentQuantity);
    });

    setState(() {
      _producttotal=getProductTotal(_productprice,_currentQuantity);
    });

  }

  String getProductTotal(String productprice, String _currentQuantity) {
    try {

      double sprice = 0.0;
      double total = double.parse(productprice);
      double taxrate = _taxrateamt;
      double qty = double.parse(_currentQuantity);

      return _producttotal =
          (((total + taxrate + sprice) - _discount) * qty).toString();
    } catch (e) {
      debugPrint('PRODUCT TOTAl EXC.:--${e}');

      return _producttotal = productprice;
    }
  }
}

【问题讨论】:

    标签: android dart flutter


    【解决方案1】:

    另一种情况;如果在弹出窗口中使用下拉按钮,则需要使用 StatefulBuilder。这是参考; How to refresh an AlertDialog in Flutter?

    【讨论】:

      【解决方案2】:

      要解决此问题,请在 TextFormField 中替换以下行:

      initialValue: '$value',
      

      与:

      controller: TextEditingController(text: value),
      

      或者更好:

      // Define a controller in the State
      class _ProductDetailsPageState extends State<ProductDetailsPage> {
        TextEditingController _controller = TextEditingController(text: value);
      
        ...
        // Then bind that controller to your TextFormField, replacing initialValue
          child: TextFormField(
            controller: _controller,
      
        ...
      
        // Then change the .text property of that controller when you want it to update
        setState(() => _controller.text = value);
      

      initialValue 仅用于设置 TextFormField 的第一个值在首次初始化 State 时将是什么,并且 State 通过重建保留,因此覆盖它永远不会导致文本更改.

      每次完全覆盖TextEditingController 或定义TextEditingController 并更改.text 属性将正确地将更改传递给字段的State 并更新您的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 2022-06-15
        • 2019-03-05
        • 2021-12-20
        • 2021-07-30
        相关资源
        最近更新 更多