getter 'bloc' 调用了 null
The getter 'bloc' called on null
我尝试使用 bloc 创建列表视图。
这是我的集团class
MainPageList 模型如下所示
class MainPageList { List items; List icons;
MainPageList(this.items, this.icons); }
class MainPageBloc extends BlocBase {
MainPageList _mainPageList;
StreamController<MainPageList> _mainPageController =
StreamController<MainPageList>.broadcast();
StreamSink<MainPageList> get _inMainPage => _mainPageController.sink;
Stream<MainPageList> get outMainPage => _mainPageController.stream;
MainPageBloc(context) {
init(context);
}
void init(BuildContext context) async {
_mainPageList.items = [
AppTranslations.of(context).text("submit_request"),
AppTranslations.of(context).text("signout")
];
_mainPageList.icons = [
"lib/assets/images/submit_req.svg",
"lib/assets/images/sign_out.svg"
];
_inMainPage.add(_mainPageList);
}
@override
void dispose() {
_mainPageController.close();
}
}
在小部件 class 中,我尝试调用 bloc。
@override
Widget build(BuildContext context) {
final MainPageBloc mainBloc = BlocProvider.of<MainPageBloc>(context);
return WillPopScope(
onWillPop: () async => false,
child: Scaffold(
body: StreamBuilder<MainPageList>(
分配流,
stream: mainBloc.outMainPage,
builder: (context, snapshot) {
Container(
child: Scaffold(
body: Container(
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: snapshot.data.items.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Container(
child: ListTile(
contentPadding: EdgeInsets.symmetric(
horizontal: 5.0, vertical: 0.0),
分配给图标
leading: Container(
child: SvgPicture.asset(
snapshot.data.icons[index],
width: 40.0,
color: const Color(0xFFE27023),
),
),
分配给项目
title: Text(
snapshot.data.items[index],
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
),
您没有提供足够的代码来了解构建方法的上下文,但您似乎正在使用 BlocProvider。您应该知道,为了在您的小部件的上下文中使用 bloc,您必须这样调用它:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: BlocProvider<MyBloc>(
bloc: MyBloc(),
child: MyHome(),
),
);
}
}
class MyHome extends StatelessWidget{
@override
Widget build(BuildContext context) {
myBloc = BlocProvider.of<MyBloc>(context);
return Container();
}
}
如您所见,我的应用程序主页不是直接的 MyHome,而是一个 BlocProvider 小部件。
我尝试使用 bloc 创建列表视图。
这是我的集团class
MainPageList 模型如下所示
class MainPageList { List items; List icons;
MainPageList(this.items, this.icons); }
class MainPageBloc extends BlocBase {
MainPageList _mainPageList;
StreamController<MainPageList> _mainPageController =
StreamController<MainPageList>.broadcast();
StreamSink<MainPageList> get _inMainPage => _mainPageController.sink;
Stream<MainPageList> get outMainPage => _mainPageController.stream;
MainPageBloc(context) {
init(context);
}
void init(BuildContext context) async {
_mainPageList.items = [
AppTranslations.of(context).text("submit_request"),
AppTranslations.of(context).text("signout")
];
_mainPageList.icons = [
"lib/assets/images/submit_req.svg",
"lib/assets/images/sign_out.svg"
];
_inMainPage.add(_mainPageList);
}
@override
void dispose() {
_mainPageController.close();
}
}
在小部件 class 中,我尝试调用 bloc。
@override
Widget build(BuildContext context) {
final MainPageBloc mainBloc = BlocProvider.of<MainPageBloc>(context);
return WillPopScope(
onWillPop: () async => false,
child: Scaffold(
body: StreamBuilder<MainPageList>(
分配流,
stream: mainBloc.outMainPage,
builder: (context, snapshot) {
Container(
child: Scaffold(
body: Container(
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: snapshot.data.items.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Container(
child: ListTile(
contentPadding: EdgeInsets.symmetric(
horizontal: 5.0, vertical: 0.0),
分配给图标
leading: Container(
child: SvgPicture.asset(
snapshot.data.icons[index],
width: 40.0,
color: const Color(0xFFE27023),
),
),
分配给项目
title: Text(
snapshot.data.items[index],
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold),
),
您没有提供足够的代码来了解构建方法的上下文,但您似乎正在使用 BlocProvider。您应该知道,为了在您的小部件的上下文中使用 bloc,您必须这样调用它:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
home: BlocProvider<MyBloc>(
bloc: MyBloc(),
child: MyHome(),
),
);
}
}
class MyHome extends StatelessWidget{
@override
Widget build(BuildContext context) {
myBloc = BlocProvider.of<MyBloc>(context);
return Container();
}
}
如您所见,我的应用程序主页不是直接的 MyHome,而是一个 BlocProvider 小部件。