gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:00:29 33 4
gpt4 key购买 nike

我的 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com