Flutter 颤振群布尔更新状态

Flutter 颤振群布尔更新状态,flutter,state,bloc,Flutter,State,Bloc,我想为我的应用程序实现一个欢迎屏幕,它能够使用不同的表单和按钮从登录更改为注册,而无需更改屏幕上的一些小部件(例如背景)。 我试着用同样的脚手架堆砌一堆东西,四周都是一个BlocProvider。welcomeBloc应负责在登录和注册表单之间更改表单。loginBloc和registerBloc应负责管理两种形式的状态和输入。 用户存储库用于诸如使用google登录等操作 class WelcomeScreen extends StatefulWidget { @override _W

我想为我的应用程序实现一个欢迎屏幕,它能够使用不同的表单和按钮从登录更改为注册,而无需更改屏幕上的一些小部件(例如背景)。 我试着用同样的脚手架堆砌一堆东西,四周都是一个BlocProvider。welcomeBloc应负责在登录和注册表单之间更改表单。loginBloc和registerBloc应负责管理两种形式的状态和输入。 用户存储库用于诸如使用google登录等操作

class WelcomeScreen extends StatefulWidget {
  @override
  _WelcomeScreenState createState() => _WelcomeScreenState();
}

class _WelcomeScreenState extends State<WelcomeScreen> {
  LoginBloc _loginBloc;
  RegisterBloc _registerBloc;
  WelcomeBloc _welcomeBloc;
  UserRepository _userRepository = UserRepository();

  @override
  void initState() {
    _loginBloc = LoginBloc(userRepository: _userRepository);
    _registerBloc = RegisterBloc(userRepository: _userRepository);
    _welcomeBloc = WelcomeBloc();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      bloc: _welcomeBloc,
      child: Scaffold(
        backgroundColor: Colors.black,
        resizeToAvoidBottomPadding: false,
        body: Stack(
          children: <Widget>[
            Opacity(opacity: 0.6, child: Background()),
            Padding(
              padding: const EdgeInsets.only(top: 130, left: 20),
              child: Text(
                "Welcome.",
                style: welcomeStyleBig,
              ),
            ),
            _welcomeBloc.getLogin
                ? BlocProvider(
                    bloc: _loginBloc,
                    child: LoginForm(
                      userRepository: _userRepository,
                    ),
                  )
                : BlocProvider(
                    bloc: _registerBloc,
                    child: RegisterForm(),
                  ),
          ],
        ),
      ),
    );
  }
}

欢迎你

abstract class WelcomeState extends Equatable {
  WelcomeState([List props = const []]) : super(props);
}

class InitialWelcomeState extends WelcomeState {
  @override
  List<Object> get props => [];
}

class WelcomeLogin extends WelcomeState {
  @override
  String toString() => 'Welcome Login';
}

class WelcomeRegister extends WelcomeState {
  @override
  String toString() => 'Welcome Register';
}
抽象类WelcomeState扩展了Equalable{
WelcomeState([List props=const[]):超级(props);
}
类InitialWelcomeState扩展了WelcomeState{
@凌驾
列表获取道具=>[];
}
类WelcomeLogin扩展了WelcomeState{
@凌驾
字符串toString()=>“欢迎登录”;
}
类WelcomeRegister扩展WelcomeState{
@凌驾
字符串toString()=>“欢迎注册”;
}

要更新小部件状态,需要BlocBuilder而不是BlocProvider

  • BlocProvider为其子级提供一个bloc
  • BlocBuilder处理生成小部件以响应新状态
您也正在使用

BlocProvider(
   bloc: _loginBloc,
BlocProvider将
builder:
作为参数而不是'bloc:' 我不明白你怎么会不出错

在您的情况下,您可以执行以下代码。
(可能有很多错误,但您可以得到概念)

此外,您正在使用的库的文档也非常优秀。 我建议你阅读它,并检查一下例子

所以我认为解决方案应该是这样的:

BlocBuilder<WelcomeEvent, WelcomeState>(
  bloc: _welcomeBloc, // provide the local bloc instance
  builder: (context, state) {
    if(state is SwitchToLogin){
      return BlocProvider(
          builder: (BuildContext context) => _loginBloc,
          child: LoginForm(
            userRepository: _userRepository,
          ),
        );
    }
    else{
      return BlocProvider(
          builder: (BuildContext context) =>_registerBloc,
          child: RegisterForm(),
        );
    }
  }
);
BlocBuilder(
bloc:\u welcomeBloc,//提供本地bloc实例
生成器:(上下文、状态){
if(状态为SwitchToLogin){
返回BlocProvider(
生成器:(BuildContext上下文)=>\u loginBloc,
子:LoginForm(
userRepository:\u userRepository,
),
);
}
否则{
返回BlocProvider(
生成器:(BuildContext上下文)=>\u registerBloc,
子项:RegisterForm(),
);
}
}
);

希望它有帮助

这有帮助,但我不得不用welcomeBloc的另一个BlocProvider包装registerBloc和loginBloc的两个BlocProvider。如果我不这样做,终端会说我正在调用BlocProvider.of(context)(当我按下切换按钮时)打开一个没有welcomeBloc的上下文。谢谢
BlocProvider(
   bloc: _loginBloc,
BlocBuilder<WelcomeEvent, WelcomeState>(
  bloc: _welcomeBloc, // provide the local bloc instance
  builder: (context, state) {
    if(state is SwitchToLogin){
      return BlocProvider(
          builder: (BuildContext context) => _loginBloc,
          child: LoginForm(
            userRepository: _userRepository,
          ),
        );
    }
    else{
      return BlocProvider(
          builder: (BuildContext context) =>_registerBloc,
          child: RegisterForm(),
        );
    }
  }
);