Flutter Streambuilder只开火一次
我遇到了一个问题,我的流生成器只启动了一次 我正在尝试根据用户选择的主题将底部导航栏配置为不同的颜色 为了做到这一点,我有一个页面,用户可以根据该页面决定是使用浅色主题还是深色主题。这会在共享首选项时保存到设备中,然后使用异步,我会将当前值流式传输到底部导航栏中 当我使用流生成器创建两个if语句时,就会出现问题。说明如果从流返回的值为0,我将在底部导航栏显示“灯光模式”。否则如果是1,我将显示一个黑色主题 当我第一次运行程序时,一切都很好。但是,在导航到设置页面并更改用户首选项后,流生成器将不会再次加载。下面是我的代码的一些快照 我已尝试删除dispose方法,该方法将关闭流。然而,这并没有解决问题 溪流建设者Flutter Streambuilder只开火一次,flutter,stream,Flutter,Stream,我遇到了一个问题,我的流生成器只启动了一次 我正在尝试根据用户选择的主题将底部导航栏配置为不同的颜色 为了做到这一点,我有一个页面,用户可以根据该页面决定是使用浅色主题还是深色主题。这会在共享首选项时保存到设备中,然后使用异步,我会将当前值流式传输到底部导航栏中 当我使用流生成器创建两个if语句时,就会出现问题。说明如果从流返回的值为0,我将在底部导航栏显示“灯光模式”。否则如果是1,我将显示一个黑色主题 当我第一次运行程序时,一切都很好。但是,在导航到设置页面并更改用户首选项后,流生成器将不会
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);
}
},
);
//
}
}
class mainPagev2扩展了StatefulWidget{
@凌驾
状态createState(){
//TODO:实现createState
返回_mainPageV2();
}
}
类_mainPageV2扩展状态
使用SingleTickerProviderStateMixin{
//TabController\u TabController;
StreamController StreamController=新的StreamController.broadcast();
@凌驾
void initState(){
super.initState();
//_tabController=tabController(vsync:this,length:_pageList.length);
Stream=新的Stream.fromFuture(readCurrentTheme());
streamController.addStream(stream);
}
@凌驾
无效处置(){
//tabController.dispose();
super.dispose();
}
字符串currentColor=“#ab3334”;
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
返回流生成器(
stream:streamController.stream,
生成器:(上下文,异步快照){
打印(asyncSnapshot.data.toString()+“Whsssat THIS”);
if(asyncSnapshot.hasData){
打印(asyncSnapshot.error);
如果(asyncSnapshot.data==0){
//返回光主题容器
currentColor=“#ffffff”;
返回第二个容器(颜色:currentColor);
}否则{
currentColor=“#101424”;
//返回黑色主题容器
返回第二个容器(颜色:currentColor);
}
}否则{
//回归黑暗主题
返回第二个容器(颜色: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;
}
Future readCurrentTheme()异步{
final prefs=wait SharedPreferences.getInstance();
最后一个键='themeMode';
最终值=prefs.getInt(键)??0;
打印('read:$value LOOK thiss');
返回值;
}
预计只要存储的值发生更改,流生成器就会触发 当存储的值发生更改时,我在您的代码中看不到从
SharedReferences
读取数据的方法。实际上,您只需阅读一次,因此StreamBuilder
只会触发一次。这是有道理的
为了能够做您想要做的事情,您必须使用一些东西来告诉您小部件应用程序中其他地方的状态已经改变。有多种方法可以实现这一点,我不会为您做出选择,因为这是基于意见的,所以您可以检查如下内容: