0

ドロップダウン メニューが開いている場合、DropdownButton は menuItem の変更を反映しません。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _title,
      home: Scaffold(
        appBar: AppBar(title: const Text(_title)),
        body: Center(
          child: MyStatefulWidget(),
        ),
      ),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  MyStatefulWidget({Key key}) : super(key: key);

  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  final disabledItems = ['Free', 'Four'];

  List<String> items = ['One', 'Two', 'Free', 'Four'];

  String dropdownValue = 'One';

  @override
  Widget build(BuildContext context) {
    return DropdownButton<String>(
      value: dropdownValue,
      icon: Icon(Icons.arrow_downward),
      iconSize: 24,
      elevation: 16,
      style: TextStyle(color: Colors.deepPurple),
      underline: Container(
        height: 2,
        color: Colors.deepPurpleAccent,
      ),
      onChanged: (String newValue) {
        if (!disabledItems.contains(newValue)) {
          setState(() {
            dropdownValue = newValue;
          });
        }
      },
      items: items.map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Row(children: [
            Text(
              value,
              style: TextStyle(
                color: disabledItems.contains(value) ? Colors.grey : null,
              ),
            ),
            IconButton(
              icon: Icon(Icons.delete),
              color: Colors.black38,
              onPressed: () {
                setState(() {
                  items.removeWhere((element) => element == 'Two');
                });

                print(items.length);
              },
            )
          ]),
        );
      }).toList(),
    );
  }
}

私が目指しているのは、削除アイコンが押されたときにメニューから項目を削除できる可能性です。予想されるイベントはすべて予想どおりに機能し、ドロップダウン アイテム リストはバックエンドで適宜更新されますが、再レンダリングされません。 削除アイコン付きの DorpDown メニュー

更新されたアイテム リストを表示するには、ドロップダウン メニューを閉じてから再度開く必要がありますが、これはユーザー エクスペリエンスの点で適切ではありません。

4

0 に答える 0