目前正在使用吉他调音器应用程序进行 BLoC 状态管理,但在使用 BlocBuilder 显示数据时遇到了一些问题。我收到此错误消息。
错误:在此 BlocBuilder<tunerBloc, TunerState> 小部件上方找不到正确的提供程序
我尝试添加提供程序,尽管我可能做错了,以及返回 Builder()。
目前,我要做的只是获取一个按钮来根据其状态(即开始、停止、重新启动)更新其文本/颜色。
这是我的 tuner.dart 代码。
class Tuner extends StatefulWidget {
const Tuner({Key? key}) : super(key: key);
@override
_TunerState createState() => _TunerState();
}
class _TunerState extends State<Tuner> {
final _bloc = tunerBloc();
final TunerState _state = tunerBloc().state;
@override
Widget build(BuildContext context) {
return Container(
height: 650,
child: Column(
children: <Widget>[
Container(
child: Padding(
padding: const EdgeInsets.only(top: 100.0),
child: BlocBuilder<tunerBloc, TunerState>(
buildWhen: (previousState, state) =>
state.runtimeType != previousState.runtimeType,
builder: (BuildContext context, state) {
return Column(
children: _mapStateToButtons(
tunerBloc: BlocProvider.of<tunerBloc>(context),
context: context),
);
},
),
),
),
Divider(
height: 50,
color: Colors.transparent,
),
],
),
);
}
_mapStateToButtons应该调用下面的代码,并根据当前状态动态更新按钮文本/颜色。
List<Widget> _mapStateToButtons(
{required tunerBloc tunerBloc, required BuildContext context}) {
final TunerState currentState = tunerBloc.state;
final raisedButtonStyle = ElevatedButton.styleFrom(
padding: EdgeInsets.all(8.0), primary: Theme.of(context).buttonColor);
if (currentState is Ready) {
return [
Container(
decoration: BoxDecoration(boxShadow: [
BoxShadow(
blurRadius: 25,
spreadRadius: 2,
color: Colors.black.withAlpha(150),
),
]),
child: ElevatedButton(
style: raisedButtonStyle,
child: Text(
"Ready",
style: Theme.of(context).textTheme.button!.copyWith(
color: Colors.green,
),
),
onPressed: () {
tunerBloc.add(
Start(),
);
},
),
),
];
} else if (currentState is Running) {
return [
Container(
decoration: BoxDecoration(boxShadow: [
BoxShadow(
blurRadius: 25,
spreadRadius: 2,
color: Colors.black.withAlpha(150),
),
]),
child: ElevatedButton(
style: raisedButtonStyle,
child: Text(
"Stop",
style: Theme.of(context).textTheme.button!.copyWith(
color: Colors.red,
),
),
onPressed: () {
tunerBloc.add(
Stop(),
);
},
),
),
];
} else if (currentState is Stopped) {
print("Stopped");
return [
Container(
decoration: BoxDecoration(boxShadow: [
BoxShadow(
blurRadius: 25,
spreadRadius: 2,
color: Colors.black.withAlpha(150),
),
]),
child: ElevatedButton(
style: raisedButtonStyle,
child: Text(
"Restart",
style: Theme.of(context).textTheme.button!.copyWith(
color: Theme.of(context).primaryColor,
),
),
onPressed: () {
tunerBloc.add(
Stop(),
);
},
),
),
];
}
return [];
}
我猜这与缺乏提供者有关,或者我没有在正确的位置声明我的构建上下文。非常感谢任何帮助,在此先感谢。