Изменение цвета строки состояния при изменении ориентации - PullRequest
0 голосов
/ 07 мая 2020

Итак, я хочу динамически изменить systemNavigationBarColor и statusBarColor. Вот моя попытка:

void systemColors(Orientation orientation) {
print('orientation changed -> $orientation');
if (orientation == Orientation.portrait) {
SystemChrome.setSystemUIOverlayStyle(
  SystemUiOverlayStyle(
    systemNavigationBarColor: Colors.blue,
    statusBarColor: Colors.green,
   ),
 );
} else {
  SystemChrome.setSystemUIOverlayStyle(
    SystemUiOverlayStyle(
        systemNavigationBarColor: Colors.green,
        statusBarColor: Colors.blue),
  );
}

Теперь эта функция вызывается каждый раз при изменении ориентации перед оператором return, возвращающим Scaffold, внутри функции построения StatelessWidget; Я пробовал StatefulWidget с теми же результатами.

Логи это подтверждают. Ориентация, переданная в функцию, также является правильной.

Однако пользовательский интерфейс обновляется только один раз, при первом вызове функции, в портретной или альбомной ориентации, и пользовательский интерфейс обновляется с помощью указанные цвета для каждого сценария.

При изменении ориентации, хотя функция вызывается, пользовательский интерфейс не обновляется.

Есть идеи, почему?

Заранее спасибо: )

1 Ответ

0 голосов
/ 09 мая 2020

Итак, мне удалось это сделать, не используя System Chrome, а фактически заключив виджет в виджет аннотированной области, например:

Orientation orientation = MediaQuery.of(context).orientation;

// return widget
return AnnotatedRegion(
  value: orientation == Orientation.portrait
         ? widget.appThemeData.systemColorsPortrait(orientation)
         : widget.appThemeData.systemColorsLandscape(orientation),
  child: Scaffold( // code continues on..

Функция systemColorPortrait выглядит так: это:

SystemUiOverlayStyle systemColorsPortrait(Orientation orientation) {
  // log
  print('systemColorsPortrait called with orientation = $orientation');

  // logic
  return SystemUiOverlayStyle(
    systemNavigationBarColor: _constants.kDarkColor,
    statusBarColor: _constants.kTransparentColor);
}

Это было сделано внутри виджета с отслеживанием состояния; AppThemeData - это класс, в котором я хранил информацию о темах, а Constants - это класс, в котором я хранил константы, используемые во всем приложении.

...