flutter - 如何在两个屏幕之间使用 block 模式

标签 flutter bloc

我的 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(),
    ),

我想在 FirstScreen 中按下按钮导航到第二个屏幕。
var router = new MaterialPageRoute(
      builder: (BuildContext context){
        return BlocProvider<UserBloc>(
          create: (BuildContext context) =>   UserBloc(),
          child: SecondScreen(),
        );
      });
  Navigator.of(context).push(router);

它工作正常,但它会创建新的 UserBloc 初始状态。
我想要的是在 UserBlog 上获取当前状态。

我试过 this
UserBloc userBloc = BlocProvider.of<UserBloc>(context);
BlocProvider<CounterBloc>(
  bloc: userBloc,
  child: SecondScreen()
 )

块给出错误。
有什么方法可以导航到 SecondScreen 并具有相同的状态。

最佳答案

每次调用 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)),
        );
      },
    );
  }
}
enter image description here

关于flutter - 如何在两个屏幕之间使用 block 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59633438/

相关文章:

flutter - 在 bloc 模式上打开抽屉

android - INSTALL_PARSE_FAILED_NO_CERTIFICATES : Failed collecting certificates for

dart - Flutter:TextFormField,更改文本

flutter - 如何在 flutter 中更改悬停时的 TextField?

flutter - Flutter:如何为StatefulWidget创建非最终属性?

flutter - BLoC - 每个州都应该是一个单独的类(class)吗?

datetime - 当我得到 endDate.millisecondsSinceEpoch 和 startDate.millisecondsSinceEpoch 之间的差异时,它给了我结果加上 2 小时?

flutter - BlocProvider.of() 使用不包含 Bloc 的上下文调用 - 即使它包含

Flutter Bloc 从网格中删除项目

flutter - 动画切换器和 Bloc Builder