我正在用BLoC模式在Flutter中重写一个非常简单的应用程序。但是,当我尝试在应用程序中使用BLoC组件时,出现错误。
我不知道该如何解决,如果有人知道,我会非常高兴!
当我尝试在BlocListener和BlocBuilder中构建窗口小部件时出现此错误。
代码:
import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../shared/custom_card.dart';
import '../bloc/average_bloc.dart';
class ArithmeticAverageScreen extends StatefulWidget {
@override
_ArithmeticAverageScreenState createState() => _ArithmeticAverageScreenState();
}
class _ArithmeticAverageScreenState extends State<ArithmeticAverageScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('arithmetic_average_title').tr(),
),
body: BlocListener<AverageBloc, AverageState>(
listener: (context, state) {
if (state is AverageError) {
return errorDialog(state.message);
}
},
child: BlocBuilder<AverageBloc, AverageState>(
builder: (context, state) {
if (state is AverageInitial) {
return buildListViewWithCards(context);
}
},
),
),
);
}
}
Widget errorDialog(message) {
return AlertDialog(
content: Text(message).tr(),
);
}
Widget buildListViewWithCards(BuildContext context) {
TextEditingController _textFieldController = TextEditingController();
return Container(
padding: EdgeInsets.all(20.0),
child: ListView(
children: <Widget>[
CustomCard(
child: Column(
children: <Widget>[
ListTile(
leading: Icon(Icons.help),
title: Text('arithmetic_average_help').tr(),
subtitle: Text('arithmetic_average_help_content').tr(),
)
],
),
),
SizedBox(height: 16.0),
CustomCard(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('arithmetic_average_your_grades', style: Theme.of(context).textTheme.headline5).tr(),
SizedBox(height: 16.0),
Text('arithmetic_average_type_grades', style: Theme.of(context).textTheme.headline6).tr(),
SizedBox(height: 16.0),
Row(
children: <Widget>[
Container(
width: 60.0,
child: TextField(
controller: _textFieldController,
decoration: InputDecoration(
labelText: 'arithmetic_average_textfield_hint'.tr(),
hintText: '5'
),
),
),
SizedBox(width: 16.0),
RaisedButton(
onPressed: () {
submitGrade(context, _textFieldController.text);
},
child: Text('arithmetic_average_add_button').tr(),
color: Colors.teal[300],
textColor: Colors.white,
)
],
)
],
),
)
),
SizedBox(height: 16.0),
CustomCard(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('arithmetic_average_your_average', style: Theme.of(context).textTheme.headline5).tr(),
SizedBox(height: 16.0),
Center(
child: Text('???', style: Theme.of(context).textTheme.headline4)
)
],
)
)
)
],
)
);
}
void submitGrade(BuildContext context, String average) {
final averageBloc = BlocProvider.of<AverageBloc>(context);
averageBloc.add(GetArithmeticAverage(average));
}
答案 0 :(得分:1)
您BlocBuilder
中没有返回任何小部件,您只是在没有return
的情况下调用了小部件功能
class _ArithmeticAverageScreenState extends State<ArithmeticAverageScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('arithmetic_average_title').tr(),
),
body: BlocListener<AverageBloc, AverageState>(
listener: (context, state) {
if (state is AverageError) {
errorDialog(state.message);
}
},
child: BlocBuilder<AverageBloc, AverageState>(
builder: (context, state) {
if (state is AverageInitial) {
return buildListViewWithCards(context); // return the widget (you didn't add `return` before
}else{
return Container();
}
},
),
),
);
}
}