【问题标题】:how the best practice for to create dynamic content of SimpleDialog widget in flutter?在颤振中创建 SimpleDialog 小部件的动态内容的最佳实践是什么?
【发布时间】:2021-10-04 01:30:32
【问题描述】:

我有 simpleDialog 小部件,当我单击其子级内的按钮时,它可以动态更改其子级或其内容,如下例所示..

class PopupDailyMood extends StatefulWidget {
  const PopupDailyMood({Key? key}) : super(key: key);

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

class _PopupDailyMoodState extends State<PopupDailyMood> {
  String mode = "selectMood";
  String mood = "";

  @override
  Widget build(BuildContext context) {
    double widthDialog = MediaQuery.of(context).size.width * 0.90;

    return SimpleDialog(
      insetPadding: EdgeInsets.symmetric(horizontal: 20),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8))),
      contentPadding: EdgeInsets.all(0),
      backgroundColor: Color(0XFF020202),
      elevation: 0,
      children: <Widget>[
        Container(
            width: widthDialog,
            padding: EdgeInsets.fromLTRB(14, 31, 14, 34),
            child: mode == "selectMood"
                ? moodSelect(context)
                : mode == "blockerConfirm"
                    ? blockerConfirm()
                    : mode == "done2"
                        ? done2()
                        : null)
      ],
    );
  }

问题.. 是否有另一种创建动态简单对话框的方法,即在触发某些操作时可以移动或更改简单对话框?

【问题讨论】:

    标签: flutter dart widget


    【解决方案1】:

    是的!有,我不建议您在谈论特定模式时使用字符串,您可以使用整数,但是这使得无法分辨每个值应该是什么,所以我向您介绍:ENUMS

    enum MoodState {
      MoodSelect,
      BlockerConfirm,
      Done2,
    }
    

    如果你在某个文件中声明一个像上面这样的枚举,你现在可以做这样的事情:

    mode == MoodState.MoodSelect
                    ? moodSelect(context)
                    : mode == MoodState.BlockerConfirm
                        ? blockerConfirm()
                        : mode == MoodState.Done2
                            ? done2()
                            : null)
    

    这有助于解决拼写错误,并允许 Intellisense 识别您想要执行的操作。但是还是有点笨重,为什么不把它移到一个函数中呢?

    Widget _buildDialog(MoodState state) {
      switch (state) {
        case MoodState.MoodSelect: return moodSelect(context);
        case MoodState.BlockerConfirm: return blockerConfirm();
        case MoodState.Done2: return done2();
      }
    }
    

    您也可以将其放入Map&lt;MoodState, Widget&gt; 类型的地图中并像这样得到它:child: myMap[moodState]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多