0

目前正在使用吉他调音器应用程序进行 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 [];
  }

我猜这与缺乏提供者有关,或者我没有在正确的位置声明我的构建上下文。非常感谢任何帮助,在此先感谢。

4

0 回答 0