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:
What I want: This for opened dropdown:
I only get text for both or just flag for both, but never as desired.
The Code so far:
DropdownButton(
items: LanguageUtils.getSupportedLanguagesAsStringList()
.map<DropdownMenuItem<String>>((String langCodeString) {
return DropdownMenuItem<String>(
value: langCodeString,
child: buildLanguageRowForDropDownButton(
langCode:
LanguageUtils.getLangCodeFromItsStringRep(langCodeString)),
);
}).toList(),
value: LanguageUtils.getStringRepForLangCode(_chosenLangCode),
onChanged: (String? value) {
changeLanguage();
},
);
/// Build row to be displayed in DropDownMenu.
Row buildLanguageRowForDropDownButton({LangCode? langCode}) {
// Use currently _chosenLangCode as default.
langCode = langCode ?? _chosenLangCode;
// Build row from settings.
List<Widget> rowElements = [];
if (showFlag) {
rowElements.add(getImageOfLangCode(langCode: langCode));
}
if (showWrittenLanguage) {
rowElements
.add(Text(LanguageUtils.getFullNameForLangCode(langCode)));
}
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: rowElements,
);
}
// LanguageUtils
/// Functions around setting app translation language.
class LanguageUtils {
LanguageUtils() {}
/// Get written rep of language to display to user.
static String getFullNameForLangCode(LangCode langCodeToGetStringFor) {
switch (langCodeToGetStringFor) {
case LangCode.en:
return "English";
break;
case LangCode.de:
return "Deutsch";
break;
}
}
/// Get short rep of language code to use programmatically when exporting state.
static String getStringRepForLangCode(LangCode langCodeToGetStringFor) {
switch (langCodeToGetStringFor) {
case LangCode.en:
return "en";
break;
case LangCode.de:
return "de";
break;
}
}
/// Get all supported LangCodes as string rep to create dropdown menu from.
static List<String> getSupportedLanguagesAsStringList() {
return LangCode.values.map((e) => e.name).toList();
}
/// To return LangCode from its converted rep.
///
/// Defaults to en => Failsafe, always returns valid LangCode.
static LangCode getLangCodeFromItsStringRep(String langCodeAsString) {
switch (langCodeAsString) {
case "de":
return LangCode.de;
break;
case "en":
default:
return LangCode.en;
break;
}
}
}
/// Supported Languages.
enum LangCode { en, de }
I looked at flutter dev, searched stackoverflow, googled and attempted to change things on my own.