У меня проблема с тем, что мой строитель потоков запускается только один раз.
Я пытаюсь настроить свой 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;
}
Ожидается, что построитель потока будет запускаться при каждом изменении сохраненного значения!