问题描述
我在另一个位于RasedButton小部件的onpressed字段内的StreamBuilder中调用StreamBuilder时遇到问题。基本上,我试图在内部StreamBuilder中访问流(向其中添加数据之后),但是执行过程不会调用代码的这一部分:
Widget submitButton(BuildContext ctx,AccountBloc bloc){
return StreamBuilder(
stream: bloc.submitValid,builder: (context,snapshot){
return SizedBox(
width: double.infinity,height: 60,child: RaisedButton(
color: HexColor("0072b1"),child: Text("Sign in",style: TextStyle(
fontWeight: FontWeight.bold,fontSize: 20,color: Colors.white
),),onpressed:() {
if(snapshot.hasData){
bloc.loginUser();
// DEBUGGING
print(bloc.isAuthenticated.listen((val) { print("debug isAuthenticated: $val"); }));
StreamBuilder(
stream: bloc.isAuthenticated,builder: (ctx,snapshotA){
print("here");
if(!snapshotA.hasData){
return Text("loading....");
}
print("***${snapshotA.data}****");
if(snapshotA.data == false){
return navSignUpScreen(ctx);
}else if (snapshotA.data == false){
print("here");
return navHomeScreen(ctx);
}
return navSignUpScreen(ctx);
}
);
}
},);
}
);
}
BLOC部分如下:
final _isAuthenticated = BehaviorSubject<bool>();
Stream<bool> get isAuthenticated => _isAuthenticated.stream;
void loginUser() async {
var inMemory = InMemoryProvider();
inMemory.newInMemoryProvider();
usermodel userResult = await _repository.loginUser(_email.value,_password.value);
if(userResult.status == 200){
// save TOKEN
usermodel usermodel = usermodel.fromJsonToModel(userResult.data);
bool res = await inMemory.store(usermodel.id,usermodel.token);
_isAuthenticated.sink.add(res);
}
_userLoginResponse.sink.add(userResult);
}
navHomeScreen定义很简单:
class HomeScreen extends StatefulWidget {
createState() {
return HomeState();
}
}
class HomeState extends State<HomeScreen> {
int _currentIndex = 0;
final List<Widget> _children = [
AllReportsScreen(),UserProfileScreen()
];
Widget build(context) {
return Scaffold(
body: _children[_currentIndex],bottomNavigationBar: mainBottomNavigatorBar(),);
}
Widget mainBottomNavigatorBar() {
return BottomNavigationBar(
type: BottomNavigationBarType.fixed,onTap: onTabTapped,currentIndex: _currentIndex,items: [
BottomNavigationBarItem(
backgroundColor: Colors.black45,icon: new Icon(Icons.note),title: new Text('Reports',style: TextStyle(fontSize: 15.0)),BottomNavigationBarItem(
backgroundColor: Colors.black45,icon: new Icon(Icons.label_important),title: new Text('Attention',icon: new Icon(Icons.person_pin),title: new Text('Profile',],);
}
void onTabTapped(int index) {
setState(() {
_currentIndex = index;
});
}
}
解决方法
使用constraint row1 = forall([...]);
中的combineLatest
将两个rxdart
和Stream
组合成一个isAuthenticated
:
submitValid