Flutter 如何在两个屏幕之间使用bloc模式
我的main.dart文件如下所示Flutter 如何在两个屏幕之间使用bloc模式,flutter,bloc,Flutter,Bloc,我的main.dart文件如下所示 home: MultiBlocProvider( providers: [ BlocProvider<UserBloc>( create: (BuildContext context) => UserBloc()..add(GetUser(userId:"5e0b62023b75dd60e22edaad")), ), BlocProvider<Todo
home: MultiBlocProvider(
providers: [
BlocProvider<UserBloc>(
create: (BuildContext context) => UserBloc()..add(GetUser(userId:"5e0b62023b75dd60e22edaad")),
),
BlocProvider<TodoBloc>(
create: (BuildContext context)=> TodoBloc()..add(AddTodoEvent()),)
],
child: FirstScreen(),
),
home:MultiBlocProvider(
供应商:[
BlocProvider(
create:(BuildContext context)=>UserBloc()…add(GetUser(userId:“5e0b62023b75dd60e22edaad”),
),
BlocProvider(
创建:(BuildContext上下文)=>TodoBloc()…添加(AddTodoEvent()),)
],
子项:FirstScreen(),
),
我想在第一个屏幕中的按钮按下时导航到第二个屏幕
var router = new MaterialPageRoute(
builder: (BuildContext context){
return BlocProvider<UserBloc>(
create: (BuildContext context) => UserBloc(),
child: SecondScreen(),
);
});
Navigator.of(context).push(router);
var路由器=新材料路径(
生成器:(BuildContext上下文){
返回BlocProvider(
create:(BuildContext context)=>UserBloc(),
子项:SecondScreen(),
);
});
导航器.of(上下文).push(路由器);
它工作正常,但会创建新的UserBloc初始状态。
我想要的是在UserBlog上获取当前状态
我试过了
UserBloc UserBloc=BlocProvider.of(上下文);
BlocProvider(
bloc:userBloc,
child:SecondScreen()
)
bloc给出了一个错误。
是否有任何方法可以导航到第二个屏幕并具有相同的状态。请查看此博客文章一次。它解释了关于使用bloc模式的清晰过程,而不需要任何插件支持的帮助。如果您需要更多帮助,请告诉我。请查看这篇博文一次。它解释了关于使用bloc模式的清晰过程,而不需要任何插件支持的帮助。如果需要更多帮助,请告诉我。每次调用BlocProvider时,都会创建bloc类的新实例 要使用同一个bloc实例,您需要创建它一次,并将其放在路由之前,之后您将可以通过上下文访问它
import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<BlocSample>(
create: (BuildContext context) => BlocSample(),
),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: FirstScreen(),
),
);
}
}
class BlocSample extends Bloc<EventSample, String> {
@override
String get initialState => 'initial state';
@override
Stream<String> mapEventToState(
EventSample event,
) async* {
yield 'changed state';
}
}
class EventSample {}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<BlocSample, String>(
builder: (context, state) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(state),
RaisedButton(
child: Text('change status'),
onPressed: () => BlocProvider.of<BlocSample>(context).add(
EventSample(),
),
),
RaisedButton(
child: Text('change route'),
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => SecondScreen(),
),
),
)
],
),
),
);
},
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<BlocSample, String>(
builder: (context, state) {
return Scaffold(
body: Center(child: Text(state)),
);
},
);
}
}
import'包:bloc/bloc.dart';
进口“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回多BlocProvider(
供应商:[
BlocProvider(
create:(BuildContext context)=>BlocSample(),
),
],
孩子:MaterialApp(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:FirstScreen(),
),
);
}
}
类BlocSample扩展了Bloc{
@凌驾
字符串get initialState=>initialState';
@凌驾
流映射事件状态(
事件示例事件,
)异步*{
产生‘变化状态’;
}
}
类EventSample{}
类FirstScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(
生成器:(上下文、状态){
返回脚手架(
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(状态),
升起的按钮(
子项:文本(“更改状态”),
onPressed:()=>BlocProvider.of(上下文)。添加(
EventSample(),
),
),
升起的按钮(
子项:文本(“更改路线”),
onPressed:()=>Navigator.of(context).push(
材料路线(
生成器:()=>SecondScreen(),
),
),
)
],
),
),
);
},
);
}
}
类SecondScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(
生成器:(上下文、状态){
返回脚手架(
主体:中心(子:文本(状态)),
);
},
);
}
}
每次调用BlocProvider时,都会创建bloc类的新实例 要使用同一个bloc实例,您需要创建它一次,并将其放在路由之前,之后您将可以通过上下文访问它
import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<BlocSample>(
create: (BuildContext context) => BlocSample(),
),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: FirstScreen(),
),
);
}
}
class BlocSample extends Bloc<EventSample, String> {
@override
String get initialState => 'initial state';
@override
Stream<String> mapEventToState(
EventSample event,
) async* {
yield 'changed state';
}
}
class EventSample {}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<BlocSample, String>(
builder: (context, state) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(state),
RaisedButton(
child: Text('change status'),
onPressed: () => BlocProvider.of<BlocSample>(context).add(
EventSample(),
),
),
RaisedButton(
child: Text('change route'),
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => SecondScreen(),
),
),
)
],
),
),
);
},
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<BlocSample, String>(
builder: (context, state) {
return Scaffold(
body: Center(child: Text(state)),
);
},
);
}
}
import'包:bloc/bloc.dart';
进口“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回多BlocProvider(
供应商:[
BlocProvider(
create:(BuildContext context)=>BlocSample(),
),
],
孩子:MaterialApp(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:FirstScreen(),
),
);
}
}
类BlocSample扩展了Bloc{
@凌驾
字符串get initialState=>initialState';
@凌驾
流映射事件状态(
事件示例事件,
)异步*{
产生‘变化状态’;
}
}
类EventSample{}
类FirstScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(
生成器:(上下文、状态){
返回脚手架(
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(状态),
升起的按钮(
子项:文本(“更改状态”),
onPressed:()=>BlocProvider.of(上下文)。添加(
EventSample(),
),
),
升起的按钮(
子项:文本(“更改路线”),
onPressed:()=>Navigator.of(context).push(
材料路线(
生成器:()=>SecondScreen(),
),
),
)
],
),
),
);
},
);
}
}
类SecondScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回BlocBuilder(
生成器:(上下文、状态){
返回脚手架(
主体:中心(子:文本(状态)),
);
},
);
}
}
我怎样才能使用p