Заставить Flutter PopupMenuButton перекрашиваться при изменении локали (язык меняется) - PullRequest
0 голосов
/ 06 февраля 2020

Кто-нибудь знает, как я могу получить список CheckedPopupMenuItems для перерисовки (они, очевидно, представляют список с параметрами, которые PopupMenuButton показывает при нажатии), когда список открывается и отображается в тот самый момент, когда я выбираю изменить язык / язык android устройство?

На данный момент, когда я делаю это, все на экране перекрашивается, чтобы отразить изменение языка, кроме открытого списка. Он перекрашивается, как только я закрываю его и открываю снова.

Спасибо за ваши предложения!

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вот код:

  Widget _buildAndroid(BuildContext context) {
    final width = MediaQuery.of(context).size.width;
    return PopupMenuButton<ScreenOrientation>(
        child: SizedBox(
            width: width,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                Icon(ScreenOrientation._getAndroidIconData(currentSelection), size: 30, color: iconColor),
                SizedBox(width: 20),
                Icon(Icons.expand_more, color: fontColor)
            ])),
        padding: EdgeInsets.zero,
        onSelected: (ScreenOrientation orientation) {
          onScreenOrientationChanged(orientation);
        },
        itemBuilder: (BuildContext context) =>
            ScreenOrientation.orientations
                .map((o) => CheckedPopupMenuItem<ScreenOrientation>(
                      key: UniqueKey(),
                      selectedColor: selectedColor,
                      child: Row(
                        children: <Widget>[
                          Icon(ScreenOrientation._getAndroidIconData(o), size: 30, color: iconColor),
                          SizedBox(width: 10),
                          Text(L10n.of(context).tr((m) =>
                            m['settings']['orientations'][o._name]),
                            style: TextStyle(color: fontColor),
                          )
                        ],
                      ),
                      value: o,
                      checked: o == currentSelection,
                    ))
                .toList());
  }

Таким образом, единственный интересный бит здесь - это L10n.of(context).tr((m) => m['settings']['orientations'][o._name], который по существу извлекает локализованную строку из правого файла json, имя которого определяется на основе текущей локали.

0 голосов
/ 06 февраля 2020

Вам, скорее всего, придется использовать Ключи. По сути, ваш список (несмотря на то, что информация изменяется) технически остается тем же виджетом, что и изначально, и поэтому ваша программа не перестраивает список при изменении информации. Если остальные виджеты вашего приложения обновляются должным образом, это означает, что вы правильно устанавливаете состояние, поэтому добавление ключей должно быть достаточным.

Это будет что-то вроде

MapSample({Key key, this.title}) : super(key: key);

для получения дополнительной информации о ключах посмотрите:

https://api.flutter.dev/flutter/widgets/Widget/key.html

Надеюсь, это поможет!

...