dart - StreamBuilder 抛出 Dirty State 说 Invalid Argu

我正在为我的 flutter 应用程序尝试 bloc 模式。当流值发生变化时,我想改变文本字段的颜色。

以下是我的 Bloc 代码

class Bloc {

  final StreamController<bool> _changeColor = PublishSubject<bool>();

  Function(bool) get changeColour => _changeColor.sink.add;

  Stream<bool> get colour => _changeColor.stream;

  void dispose(){
    _changeColor.close();
  }

}

以下是我继承的小部件

class Provider extends InheritedWidget {

  final bloc = Bloc();
  Provider({Key key,Widget child}): super(key: key,child: child);

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) {
    return true;
  }

  static Bloc of(BuildContext context){
    return (context.inheritFromWidgetOfExactType(Provider) as Provider).bloc;
  }

}

以下是我的主要类(class)

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    final bloc = Provider.of(context);

    return Column(
      children: <Widget>[
        RaisedButton(
          onPressed: () {
            bloc.changeColour(true);
          },
          child: Text("Change colour"),
        ),
        StreamBuilder(
          builder: (context, snapshot) {
            print("pritish" + snapshot.data);
            return Text(
              "First text",
              style:
                  TextStyle(color: snapshot.hasData ? Colors.red : Colors.green),
            );
          },
          stream: bloc?.colour,
        ),
      ],
    );
  }

}

以下是抛出的异常

flutter: The following ArgumentError was thrown building StreamBuilder<bool>(dirty, state:
flutter: _StreamBuilderBaseState<bool, AsyncSnapshot<bool>>#24b36):
flutter: Invalid argument(s)
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      _StringBase.+ (dart:core/runtime/libstring_patch.dart:251:57)
flutter: #1      _HomePageState.build.<anonymous closure> (package:bloc_pattern_for_booleans/main.dart:42:29)

最佳答案

错误是因为您试图在这一行中对 String + null 求和:

print("pritish" + snapshot.data);

所以,要解决您的问题,请使用字符串插值:

print("pritish : ${snapshot.data}");

不要忘记将 HomePage 小部件包装在提供程序中。

 MaterialApp(
        home: Provider(
          child: HomePage()
        ),
      ),

关于dart - StreamBuilder 抛出 Dirty State 说 Invalid Arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54228885/

相关文章:

testing - 如何在 Flutter 中测试私有(private)函数/方法?

dart - Flutter ThemeData 不适用于文本

flutter - 如何在 Flutter 中向 TextFormField 添加阴影

dart - 同屏多于一个 float 操作按钮显示黑屏

dart - Flutter - 如何在 flutter 的数字键盘中添加完成按钮

android - Flutter:构建 APK 时如何传递 Gradle 参数?

dart - 事件队列和微任务队列

dart - 如何在 Dart 中发出网络请求并返回一个 json 对象

amazon-web-services - 在 Flutter 中从 AWS S3 上传和获取媒体文

dart - flutter ListView 滚动到索引不可用