Flutter 如何在两个屏幕之间使用bloc模式

Flutter 如何在两个屏幕之间使用bloc模式,flutter,bloc,Flutter,Bloc,我的main.dart文件如下所示 home: MultiBlocProvider( providers: [ BlocProvider<UserBloc>( create: (BuildContext context) => UserBloc()..add(GetUser(userId:"5e0b62023b75dd60e22edaad")), ), BlocProvider<Todo

我的main.dart文件如下所示

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