StreamBuilder 抛出 Dirty State 说 Invalid Arguments

Posted

技术标签:

【中文标题】StreamBuilder 抛出 Dirty State 说 Invalid Arguments【英文标题】:StreamBuilder throws Dirty State saying Invalid Arguments 【发布时间】:2019-06-11 05:42:01 【问题描述】:

我正在为我的颤振应用程序尝试 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 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)

【问题讨论】:

【参考方案1】:

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

print("pritish" + snapshot.data);

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

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

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

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

【讨论】:

让我试一试,然后回复您。我不认为 print 语句会导致错误 相信我兄弟 :) 删除打印语句后,我得到另一个错误说══╡异常被小部件库╞═══════════════════════ ════════════════════════════════════ I/Flutter(方法 9674 引发了主页构建错误): (脏,状态:_HomePageState#54b7c):I/flutter(9674):在 null 上调用了 getter 'bloc'。 I/flutter(9674):接收者:null I/flutter(9674):尝试调用:bloc 是的,你还有一个错误,检查我更新的答案 你能看看这个***.com/questions/54185792/…

以上是关于StreamBuilder 抛出 Dirty State 说 Invalid Arguments的主要内容,如果未能解决你的问题,请参考以下文章

在构建 ItemCard(dirty) 时抛出了以下断言:在构建期间调用了 setState() 或 markNeedsBuild()

Apktool 2.3.3-dirty:APK 重新编译期间出错

StreamBuilder 限制

如何在颤动中直接将数据从 StreamBuilder 获取到 GridView 中?

如何使用 StreamBuilder 消除颤振数据表错误“预期类型为 'List<DataRow>',但得到类型为 'List<dynamic>”的值之一?

NoSuchMethodError 被抛出构建选项卡(脏,状态:_TabsState#fefcf):方法 '[]' 在 null 上被调用