Ad

Why Do I Need To Cast The Value Of The Rx Object On Initialization?

Consider this code:

Rx<Widget> rxwidget = const Text("test").obs;
rxwidget.value = Container();

This will throw the following error on runtime

Expected a value of type 'Text', but got one of type 'Container'

This seems very illogical to me because the variable only requires it to be a Widget which both are. It somehow restricts the type to the first value it gets. But if I write it like this:

Rx<Widget> rxwidget = (const Text("test") as Widget).obs;
rxwidget.value = Container();

It works fine, but the IDE (Android Studio) actually complains that the cast is unnecessary.
Note, removing the const keyword doesn't help.

Another example

Rx<String?> test = null.obs;
test.value = "test";

giving

Expected a value of type 'Null', but got one of type 'String'

I'm pretty sure it used to work, so I suspect it's a recent change in flutter.

Is this maybe an error in flutter/dart? Or why is this?

version info:

Flutter 2.10.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 7e9793dee1 (2 weeks ago) • 2022-03-02 11:23:12 -0600
Engine • revision bd539267b4
Tools • Dart 2.16.1 • DevTools 2.9.2
Ad

Answer

Because of

Rx<T> get obs => Rx<T>(this);

So (const Text("test")).obs has type Rx<Text> -> wrong

Solution

final rxwidget = Rx<Widget>(const Text("test"));
Ad
source: stackoverflow.com
Ad