Flutter下拉框选中的项目样式与其他项目不同

huangapple go评论88阅读模式
英文:

Flutter Dropdown Different Selected Item Style than Items

问题

以下是您要求的翻译部分:

  1. DropdownButton(
  2. items: LanguageUtils.getSupportedLanguagesAsStringList()
  3. .map<DropdownMenuItem<String>>((String langCodeString) {
  4. return DropdownMenuItem<String>(
  5. value: langCodeString,
  6. child: buildLanguageRowForDropDownButton(
  7. langCode:
  8. LanguageUtils.getLangCodeFromItsStringRep(langCodeString)),
  9. );
  10. }).toList(),
  11. value: LanguageUtils.getStringRepForLangCode(_chosenLangCode),
  12. onChanged: (String? value) {
  13. changeLanguage();
  14. },
  15. );
  16. /// 构建在下拉菜单中显示的行。
  17. Row buildLanguageRowForDropDownButton({LangCode? langCode}) {
  18. // 使用当前的_chosenLangCode作为默认值。
  19. langCode = langCode ?? _chosenLangCode;
  20. // 从设置构建行。
  21. List<Widget> rowElements = [];
  22. if (showFlag) {
  23. rowElements.add(getImageOfLangCode(langCode: langCode));
  24. }
  25. if (showWrittenLanguage) {
  26. rowElements
  27. .add(Text(LanguageUtils.getFullNameForLangCode(langCode)));
  28. }
  29. return Row(
  30. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  31. children: rowElements,
  32. );
  33. }
  1. // LanguageUtils
  2. /// 围绕设置应用程序翻译语言的功能。
  3. class LanguageUtils {
  4. LanguageUtils() {}
  5. /// 获取要显示给用户的语言的书面表示。
  6. static String getFullNameForLangCode(LangCode langCodeToGetStringFor) {
  7. switch (langCodeToGetStringFor) {
  8. case LangCode.en:
  9. return "English";
  10. break;
  11. case LangCode.de:
  12. return "Deutsch";
  13. break;
  14. }
  15. }
  16. /// 获取用于在导出状态时以编程方式使用的语言代码的短表示。
  17. static String getStringRepForLangCode(LangCode langCodeToGetStringFor) {
  18. switch (langCodeToGetStringFor) {
  19. case LangCode.en:
  20. return "en";
  21. break;
  22. case LangCode.de:
  23. return "de";
  24. break;
  25. }
  26. }
  27. /// 获取所有支持的LangCodes的字符串表示,以创建下拉菜单。
  28. static List<String> getSupportedLanguagesAsStringList() {
  29. return LangCode.values.map((e) => e.name).toList();
  30. }
  31. /// 从其转换表示返回LangCode。
  32. ///
  33. /// 默认为en => 安全,始终返回有效的LangCode。
  34. static LangCode getLangCodeFromItsStringRep(String langCodeAsString) {
  35. switch (langCodeAsString) {
  36. case "de":
  37. return LangCode.de;
  38. break;
  39. case "en":
  40. default:
  41. return LangCode.en;
  42. break;
  43. }
  44. }
  45. }
  46. /// 支持的语言。
  47. enum LangCode { en, de }

希望这些翻译对您有所帮助。如有其他疑问,请随时提出。

英文:

I am developping an UI for the user to change the app language.

When showing the currently selected language I want to only display the flag with a dropdown icon. When the user clicks on the dropdown button I want the full string representation of the language to be added.

I can't seem to find a way to make the the selected item to look different than the menu items.

What I want:
This for unopened dropdown:
Flutter下拉框选中的项目样式与其他项目不同
What I want: This for opened dropdown:
Flutter下拉框选中的项目样式与其他项目不同

Unwanted:
Flutter下拉框选中的项目样式与其他项目不同
Unwanted:
Flutter下拉框选中的项目样式与其他项目不同

I only get text for both or just flag for both, but never as desired.

The Code so far:

  1. DropdownButton(
  2. items: LanguageUtils.getSupportedLanguagesAsStringList()
  3. .map&lt;DropdownMenuItem&lt;String&gt;&gt;((String langCodeString) {
  4. return DropdownMenuItem&lt;String&gt;(
  5. value: langCodeString,
  6. child: buildLanguageRowForDropDownButton(
  7. langCode:
  8. LanguageUtils.getLangCodeFromItsStringRep(langCodeString)),
  9. );
  10. }).toList(),
  11. value: LanguageUtils.getStringRepForLangCode(_chosenLangCode),
  12. onChanged: (String? value) {
  13. changeLanguage();
  14. },
  15. );
  16. /// Build row to be displayed in DropDownMenu.
  17. Row buildLanguageRowForDropDownButton({LangCode? langCode}) {
  18. // Use currently _chosenLangCode as default.
  19. langCode = langCode ?? _chosenLangCode;
  20. // Build row from settings.
  21. List&lt;Widget&gt; rowElements = [];
  22. if (showFlag) {
  23. rowElements.add(getImageOfLangCode(langCode: langCode));
  24. }
  25. if (showWrittenLanguage) {
  26. rowElements
  27. .add(Text(LanguageUtils.getFullNameForLangCode(langCode)));
  28. }
  29. return Row(
  30. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  31. children: rowElements,
  32. );
  33. }
  1. // LanguageUtils
  2. /// Functions around setting app translation language.
  3. class LanguageUtils {
  4. LanguageUtils() {}
  5. /// Get written rep of language to display to user.
  6. static String getFullNameForLangCode(LangCode langCodeToGetStringFor) {
  7. switch (langCodeToGetStringFor) {
  8. case LangCode.en:
  9. return &quot;English&quot;;
  10. break;
  11. case LangCode.de:
  12. return &quot;Deutsch&quot;;
  13. break;
  14. }
  15. }
  16. /// Get short rep of language code to use programmatically when exporting state.
  17. static String getStringRepForLangCode(LangCode langCodeToGetStringFor) {
  18. switch (langCodeToGetStringFor) {
  19. case LangCode.en:
  20. return &quot;en&quot;;
  21. break;
  22. case LangCode.de:
  23. return &quot;de&quot;;
  24. break;
  25. }
  26. }
  27. /// Get all supported LangCodes as string rep to create dropdown menu from.
  28. static List&lt;String&gt; getSupportedLanguagesAsStringList() {
  29. return LangCode.values.map((e) =&gt; e.name).toList();
  30. }
  31. /// To return LangCode from its converted rep.
  32. ///
  33. /// Defaults to en =&gt; Failsafe, always returns valid LangCode.
  34. static LangCode getLangCodeFromItsStringRep(String langCodeAsString) {
  35. switch (langCodeAsString) {
  36. case &quot;de&quot;:
  37. return LangCode.de;
  38. break;
  39. case &quot;en&quot;:
  40. default:
  41. return LangCode.en;
  42. break;
  43. }
  44. }
  45. }
  46. /// Supported Languages.
  47. enum LangCode { en, de }

I looked at flutter dev, searched stackoverflow, googled and attempted to change things on my own.

答案1

得分: 2

看起来你需要使用DropdownButtonselectedItemBuilder

以下是一个示例,你可以尝试并插入你的数据以获得所需的输出:

  1. import 'package:flutter/material.dart';
  2. const List<String> list = <String>['One ', 'Two ', 'Three', 'Four'];
  3. void main() => runApp(const DropdownButtonApp());
  4. class DropdownButtonApp extends StatelessWidget {
  5. const DropdownButtonApp({super.key});
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: Scaffold(
  10. appBar: AppBar(title: const Text('DropdownButton Sample')),
  11. body: const Center(
  12. child: DropdownButtonExample(),
  13. ),
  14. ),
  15. );
  16. }
  17. }
  18. class DropdownButtonExample extends StatefulWidget {
  19. const DropdownButtonExample({super.key});
  20. @override
  21. State<DropdownButtonExample> createState() => _DropdownButtonExampleState();
  22. }
  23. class _DropdownButtonExampleState extends State<DropdownButtonExample> {
  24. String dropdownValue = list.first;
  25. @override
  26. Widget build(BuildContext context) {
  27. return DropdownButton<String>(
  28. value: dropdownValue,
  29. elevation: 16,
  30. style: const TextStyle(color: Colors.deepPurple),
  31. underline: Container(
  32. height: 2,
  33. color: Colors.deepPurpleAccent,
  34. ),
  35. onChanged: (String? value) {
  36. // 用户选择项目时调用此函数。
  37. setState(() {
  38. dropdownValue = value!;
  39. });
  40. },
  41. selectedItemBuilder: (context) =>
  42. List.generate(1,
  43. (i) =>
  44. const SizedBox(
  45. width: 50,
  46. child: Icon(Icons.flag)
  47. )
  48. ),
  49. items: list.map<DropdownMenuItem<String>>((String value) {
  50. return DropdownMenuItem<String>(
  51. value: value,
  52. child: SizedBox(
  53. width: 100,
  54. child: Row(
  55. mainAxisSize: MainAxisSize.min,
  56. children: [const Icon(Icons.flag), Text(value)],
  57. ),
  58. ),
  59. );
  60. }).toList(),
  61. );
  62. }
  63. }

注意:SizedBox很重要,这样它就不会引发视口错误。

英文:

Looks like you need to use the selectedItemBuilder of DropdownButton.

Here's an example you can try and plug in your data to get the desired output:

  1. import &#39;package:flutter/material.dart&#39;;
  2. const List&lt;String&gt; list = &lt;String&gt;[&#39;One &#39;, &#39;Two &#39;, &#39;Three&#39;, &#39;Four&#39;];
  3. void main() =&gt; runApp(const DropdownButtonApp());
  4. class DropdownButtonApp extends StatelessWidget {
  5. const DropdownButtonApp({super.key});
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: Scaffold(
  10. appBar: AppBar(title: const Text(&#39;DropdownButton Sample&#39;)),
  11. body: const Center(
  12. child: DropdownButtonExample(),
  13. ),
  14. ),
  15. );
  16. }
  17. }
  18. class DropdownButtonExample extends StatefulWidget {
  19. const DropdownButtonExample({super.key});
  20. @override
  21. State&lt;DropdownButtonExample&gt; createState() =&gt; _DropdownButtonExampleState();
  22. }
  23. class _DropdownButtonExampleState extends State&lt;DropdownButtonExample&gt; {
  24. String dropdownValue = list.first;
  25. @override
  26. Widget build(BuildContext context) {
  27. return DropdownButton&lt;String&gt;(
  28. value: dropdownValue,
  29. //icon: const Icon(Icons.arrow_downward),
  30. elevation: 16,
  31. style: const TextStyle(color: Colors.deepPurple),
  32. underline: Container(
  33. height: 2,
  34. color: Colors.deepPurpleAccent,
  35. ),
  36. onChanged: (String? value) {
  37. // This is called when the user selects an item.
  38. setState(() {
  39. dropdownValue = value!;
  40. });
  41. },
  42. selectedItemBuilder: (context) =&gt;
  43. List.generate(1,
  44. (i) =&gt;
  45. const SizedBox(
  46. width: 50,
  47. child: Icon(Icons.flag)
  48. )
  49. ),
  50. items: list.map&lt;DropdownMenuItem&lt;String&gt;&gt;((String value) {
  51. return DropdownMenuItem&lt;String&gt;(
  52. value: value,
  53. child: SizedBox(
  54. width: 100,
  55. child: Row(
  56. mainAxisSize: MainAxisSize.min,
  57. children: [const Icon(Icons.flag), Text(value)],
  58. ),
  59. ),
  60. );
  61. }).toList(),
  62. );
  63. }
  64. }

Note: SizedBox is important so it doesn't throw viewport errors.

huangapple
  • 本文由 发表于 2023年2月27日 14:43:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/75577417.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定