【问题标题】:Flutter DropdownButton not updated by setStateFlutter DropdownButton 未由 setState 更新
【发布时间】:2019-09-07 18:18:57
【问题描述】:

我有这个颤振代码。 当我从下拉列表中选择新项目时,_selectedCurrency 的值会更新,但下拉按钮本身不会更新。显示的项目始终为 USD

import 'package:flutter/material.dart';

import 'coin_data.dart' as coinData;

class PriceScreen extends StatefulWidget {
  @override
  _PriceScreenState createState() => _PriceScreenState();
}

class _PriceScreenState extends State<PriceScreen> {
  String _selectedCurrency = "USD";
  DropdownButton _currencyDropdownButton;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Coin Ticker'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Container(
            height: 150.0,
            alignment: Alignment.center,
            padding: EdgeInsets.only(bottom: 30.0),
            color: Colors.lightBlue,
            child: _currencyDropdownButton,
          ),
        ],
      ),
    );
  }

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

    _currencyDropdownButton = DropdownButton<String>(
      value: _selectedCurrency,
      items:
          coinData.currenciesList.map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
      onChanged: (value) {
        setState(() {
          _selectedCurrency = value;
        });
      },
    );
  }
}

但如果我在 build() 中创建了 DropdownButton 小部件,那么一切正常,就像这样

import 'package:flutter/material.dart';

import 'coin_data.dart' as coinData;

class PriceScreen extends StatefulWidget {
  @override
  _PriceScreenState createState() => _PriceScreenState();
}

class _PriceScreenState extends State<PriceScreen> {
  String _selectedCurrency = "USD";
  DropdownButton _currencyDropdownButton;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Coin Ticker'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Container(
            height: 150.0,
            alignment: Alignment.center,
            padding: EdgeInsets.only(bottom: 30.0),
            color: Colors.lightBlue,
            child: DropdownButton<String>(
              value: _selectedCurrency,
              items: coinData.currenciesList
                  .map<DropdownMenuItem<String>>((String value) {
                return DropdownMenuItem<String>(
                  value: value,
                  child: Text(value),
                );
              }).toList(),
              onChanged: (value) {
                setState(() {
                  _selectedCurrency = value;
                });
              },
            ),
          ),
        ],
      ),
    );
  }
}

我正在努力使我的代码整洁,而不是在 build() 上创建所有内容。
initState() 上创建小部件是否正确?

谢谢

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    为什么要将小部件放在initState() 中?在重建过程中,只有build() 中的小部件会得到更新,但您在 init 中创建了一个不可变的小部件。 我为您提供使用provider 包。创建一个新的StatelessWidget 类并在根目录中使用ChangeNotifierProvider&lt;String&gt;() 在每次更改时重建您的小部件。

    【讨论】:

    • 为了避免在build()上写每个小部件,所以代码应该更干净。
    【解决方案2】:

    没有initState只被调用一次,在构建时,如果你在里面声明你不能改变,GlobalKey可能是可能的。尝试GlobalKey。 当 setState(); 时,调用 build 方法获取更新。所以我们只能将小部件放在 build 方法中。

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2021-05-14
      • 1970-01-01
      • 2020-08-18
      相关资源
      最近更新 更多