1

我想Dismissible在 a 中使用 WidgetPopupMenuButton来删除弹出列表中的项目。我的示例代码(请参阅main()下面的示例代码)适用于删除 PopupMenuButton 中的项目(字符串),但列表不会刷新和调整大小,在仍然显示弹出窗口时让列表中的空白区域。
该列表仅在弹出窗口关闭然后重新打开后才显示调整大小。我从回调中
的列表中删除了该项目,因此应该重建小部件树。 如何更新和调整弹出列表中显示的列表而无需关闭并重新打开它?setStateonDismissed

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter PopupMenuButton sample',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String dropdownValue = 'Orange';

  final _items = [
    'Orange',
    'Banana',
    'Grapes',
    'Apple',
    'watermelon',
    'Pineapple'
  ];

  @override
  Widget build(BuildContext context) {
    print("build Scaffold");
    return Scaffold(
      appBar: AppBar(
        title: Text("DropDownList Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("$dropdownValue"),
            const Spacer(),
            PopupMenuButton<String>(
              icon: Icon(Icons.bookmarks_outlined),
              onSelected: (String value) {
                setState(() {
                  dropdownValue = value;
                });
                print(value);
              },
              itemBuilder: (BuildContext context) {
                return _items.map<PopupMenuItem<String>>((String _value) {
                  return PopupMenuItem(
                    value: _value,
                    child: Dismissible(
                      key: UniqueKey(),
                      direction: DismissDirection.endToStart,
                      onDismissed: (i) {
                        print("onDismissed $_value");
                        setState(() {
                          _items.remove(_value);
                        });
                      },
                      child: ListTile(
                        title: Text(_value),
                        trailing: const Icon(Icons.arrow_back),
                      ),
                      background: Container(
                        color: Colors.red,
                        margin: const EdgeInsets.symmetric(horizontal: 15),
                        alignment: Alignment.centerRight,
                        child: const Icon(
                          Icons.delete,
                          color: Colors.white,
                        ),
                      ),
                    ),
                  );
                }).toList();
              },
            ),
            const Spacer(
              flex: 10,
            ),
          ],
        ),
      ),
    );
  }
}

4

0 回答 0