Streambuilder только огонь один раз - PullRequest
0 голосов
/ 07 июля 2019

У меня проблема с тем, что мой строитель потоков запускается только один раз.

Я пытаюсь настроить свой bottomNavigationBar на другой цвет в зависимости от темы, выбранной пользователем.

Для этого у меня есть страница, на которой пользователь может решить, использовать ли светлую тему или темную тему. Это сохраняется в устройстве, в то время как общие настройки, а затем с помощью асинхронного, я буду передавать текущее значение в мой bottomNavigationBar.

Проблема возникает, когда я использую построитель потока для создания двух операторов if. Заявив, что если значение, возвращаемое потоком, равно 0, я покажу нижнюю панель навигации «облегченного режима». Иначе, если его 1, я покажу темную тему.

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

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

Построитель потока

class mainPagev2 extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _mainPageV2();
  }
}

class _mainPageV2 extends State<mainPagev2>
    with SingleTickerProviderStateMixin {

//  TabController _tabController;
  StreamController<int> streamController = new StreamController.broadcast();

  @override
  void initState() {
    super.initState();
//    _tabController = TabController(vsync: this, length: _pageList.length);
    Stream<int> stream = new Stream.fromFuture(readCurrentTheme());
    streamController.addStream(stream);

  }

  @override
  void dispose() {
//    _tabController.dispose();
    super.dispose();
  }
  String currentColor = "#ab3334";
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return StreamBuilder(
      stream: streamController.stream,
      builder: (context, asyncSnapshot) {
        print(asyncSnapshot.data.toString() + "WHssssAT IS THIS");
        if (asyncSnapshot.hasData) {
          print(asyncSnapshot.error);
          if (asyncSnapshot.data == 0) {
            //Return light themed Container
            currentColor = "#ffffff";
            return ThemeContainer(color: currentColor );
          } else {
            currentColor = "#101424";
            //Return dark themed Container
            return ThemeContainer(color: currentColor );

          }
        } else {
          //return dark themed
          return ThemeContainer(color:currentColor);

        }
      },
    );
//
  }
}

Асинхронный код для извлечения сохраненного значения

Future<int> readCurrentTheme() async {
  final prefs = await SharedPreferences.getInstance();
  final key = 'themeMode';
  final value = prefs.getInt(key) ?? 0;
  print('read: $value LOOK AT THISSS');
  return value;
}

Ожидается, что построитель потока будет запускаться при каждом изменении сохраненного значения!

1 Ответ

1 голос
/ 08 июля 2019

Я не вижу в вашем коде способа чтения данных из SharedPreferences, когда сохраненное значение изменяется. Вы фактически читаете это один раз, поэтому StreamBuilder стреляет только один раз. Это имеет смысл.

Чтобы иметь возможность делать то, что вы хотите, вы должны использовать что-то, чтобы сообщить виджету, что состояние изменилось в другом месте приложения. Есть несколько способов добиться этого, и я не буду делать выбор за вас, поскольку это будет основано на мнении, поэтому вы можете проверить такие вещи, как BloC , Provider , ScopedModel , InheritedWidget

...