Search code examples
flutterdartlocalization

Reload page after locale change


After changing locale in context.setLocale() language in inactive widgets change. But I cannot figure out, hoe to reload current widget in new locale. Any ideas how to get it working?

Body of widget:

Form(
  child: CardSettings(
    children: <CardSettingsSection>[
      CardSettingsSection(
        header: CardSettingsHeader(
          label: 'settings.general'.tr(),
        ),
        children: [
          CardSettingsListPicker(
            label: 'Language',
            items: context.supportedLocales
                .map((locale) =>
                    locale.toStringWithSeparator(separator: ' '))
                .toList(),
            initialItem:
                context.locale.toStringWithSeparator(separator: ' '),
            onChanged: (String newLocale) {
              context.setLocale(newLocale.toLocale(separator: ' '));
              _getOptions();
            },
          ),
        ],
      ),
      CardSettingsSection(
        header: CardSettingsHeader(
          label: 'Map',
        ),
        children: [
          CardSettingsListPicker(
            label: 'default floor',
            items: _floorList,
            initialItem: _floor,
            onChanged: (String value) {
              var floor = tr('plan.floor.' + value);
              _preferences.setString('mapDefaultFloor', floor);
            },
          ),
        ],
      ),
    ],
  ),
);

And options are loaded via async function called in initState and later on in code...

void _getOptions() {
  setState(() {
    _floorList = Floor.values
        .map((value) => tr('plan.floor.' + value.toString().split('.')[1]))
        .toList();
    _planTypeList = PlanType.values
        .map((value) => tr('plan.type.' + value.toString().split('.')[1]))
        .toList();
    _floor = tr('plan.floor.' +
        (_preferences.getString('mapDefaultFLoor') ?? 'ground'));
    _planType = tr('plan.type.' +
        (_preferences.getString('mapDefaultType') ?? 'newNumbers'));
  });
}

Solution

  • Solution was to make _getOptions() async and add the locale change there with await keyword. This way it is ensured that locale is changed before loading new values...