[英]How to use bloc pattern between two screens
我的 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 上獲取當前狀態。
我試過這個
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)),
);
},
);
}
}
請查看此博文https://blog.geekyants.com/state-management-in-flutter-7df833e6f3bd一次。 它在不借助任何插件支持的情況下解釋了使用 bloc 模式的清晰過程。 如果您需要更多幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.