Flutter_bloc框架使用笔记,后续估计都不太会用了

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(LS.of(context, “register”)),
),
body: BlocProvider(
create: (_) => _registerBloc,
child: RegisterScreen(widget.phone),
),
);
}
}

作为一个主体的页面,定义了route名称。 可以使用StatelessWidget。因为正常也没什么状态管理

在state里面的builder里构建了BlocProvider

body: BlocProvider(
create: (_) => _registerBloc,
child: RegisterScreen(widget.phone),
)

这里是为后续的节点注册了一个RegisterBloc, 从这个节点下级的widget就可以通过Provider.of<RegisterBloc>来获取。 当然也可以有其他的方式比如context.read<RegisterBloc>来获取。

这里也可以把bloc传给screen,可以方便在screen里面获取bloc。而不是通过在配置树里查找bloc。能稍微减少些性能消耗。

  1. screen

screen主要是构建配置页面内容用。

class RegisterScreen extends StatelessWidget {
const RegisterScreen(
this.phone, {
Key? key,
}) : super(key: key);

final String phone;

@override
Widget build(BuildContext context) {
return BlocListener<RegisterBloc, RegisterState>(
listener: (ctx, state) {
if (state.status.isSubmissionInProgress) {
EasyLoading.show(
maskType: EasyLoadingMaskType.clear, dismissOnTap: false);
return;
}
if (state.status.isSubmissionFailure) {
EasyLoading.dismiss();
var message = LS.of(context, “register_error”);
EasyLoading.showError(‘ m e s s a g e : message: message:{state.errMessage ?? ‘’}’);
return;
}
if (state.status.isSubmissionSuccess) {
EasyLoading.dismiss();
showCupertinoDialog(
context: context,
builder: (context) {
return
AlertDialog(
content: Text(LS.of(context, “register_success”)),
actions: [TextButton(onPressed: (){
Navigator.of(context).popUntil(ModalRoute.withName(“/”));
}, child: Text(LS.of(context, “confirm”)))],
);
});
}
},
child: Align(
alignment: Alignment(0, -1),
child: Padding(
padding: const EdgeInsets.only(top: 31, left: 36, right:36),
child: Column(children: [
_UsernameInput(),
_PasswordInput(),
_ConfirmPasswordInput(),
const SizedBox(
height: 20,
),
_RegisterButton()
]),
),
));
}
}

class _RegisterButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<RegisterBloc, RegisterState>(builder: (context, state) {
return CircleRectButton(
child: Text(LS.of(context, “register”), style: TextStyle(letterSpacing: 20)),
onPressed: state.status.isValidated
? () async {
context.read().add(RegisterSubmitEvent());
}
: null);
});
}
}

BlocListener: 通过BlocListener来监听状态消息,收到消息child不会rebuild。适合拿来弹出加载页,错误信息等。

BlocBuilder 通过BlocBuilder来包装需要修改的内容。 这里的在组装页面的时候尽量在涉及到更新的地方使用 BlocBuilder,也尽可能的考虑buildwhen 属性。保持当必须要更新时才重新build的思路。

  1. bloc

bloc 在封装后没什么逻辑,他的思路就是接受页面的事件,转为状态变更返回给页面。

class RegisterBloc extends Bloc<RegisterEvent, RegisterState> {

RegisterBloc(RegisterState initialState) : super(initialState);

@override
Stream mapEventToState(
RegisterEvent event,
) async* {
try {
yield* event.applyAsync(currentState: state, bloc: this);
} catch (, stackTrace) {
developer.log('$
', name: ‘RegisterBloc’, error: _, stackTrace: stackTrace);
yield state;
}
}
}

将对应的事件处理放在event里面去执行显然更符合设计模式。代码也会更清晰,而不用做很多判断

if(event is event){
do(
)
} else if (event is event) {
do(
)
}

  1. event

@immutable
abstract class RegisterEvent {
const RegisterEvent();
Stream applyAsync({required RegisterState currentState, required RegisterBloc bloc});
}

class UsernameChangeEvent extends RegisterEvent {
const UsernameChangeEvent(this.username);
final String username;

Stream applyAsync({required RegisterState currentState, required RegisterBloc bloc}) async* {
var input = UsernameInput.dirty(username);
var status = Formz.validate([input, currentState.password, currentState.confirmPassword]);
yield currentState.copyWith(username: input, status: status);
}

}

抽象event,定义事件接口。 子类event来接收参数,实现事件接口并抛出新的状态给页面。

  1. state

class RegisterState extends Equatable {
final UsernameInput username;
final PasswordTwoInput password;
final PasswordTwoInput confirmPassword;
final FormzStatus status;

最后

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
019-2021面试真题解析**

[外链图片转存中…(img-9aY6Xjqa-1714705476498)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值