如何在 flutter 中创建 SimpleDialog 小部件的动态内容的最佳实践?
how the best practice for to create dynamic content of SimpleDialog widget in flutter?
我有 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)
],
);
}
问题.. 是否有另一种创建动态简单对话框的方法,即可以在触发某些操作时移动或更改简单对话框?
是的!有一点,我不建议你在谈论特定模式时使用字符串,你可以使用整数,但是这使得无法分辨每个值应该是什么,所以我向你展示: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<MoodState, Widget>
的映射中,然后像这样获取它:child: myMap[moodState]
我有 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)
],
);
}
问题.. 是否有另一种创建动态简单对话框的方法,即可以在触发某些操作时移动或更改简单对话框?
是的!有一点,我不建议你在谈论特定模式时使用字符串,你可以使用整数,但是这使得无法分辨每个值应该是什么,所以我向你展示: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<MoodState, Widget>
的映射中,然后像这样获取它:child: myMap[moodState]