Вы хотите смоделировать свои данные, используя закрытые классы:
abstract class Data {}
class Content implements Data {
Content(this.data);
final List<String> data;
}
class Error implements Data {
Error(this.msg);
final String msg;
}
class Loading implements Data {
const Loading();
}
Затем используется так же в провайдере:
StreamProvider<Data>(
builder: (_) async* {
yield Content(['hello', 'world']);
},
initialData: const Loading(),
catchError: (_, err) => Error(err.toString()),
child: Container(),
);
И потребляется как таковой:
Consumer<Data>(
builder: (_, data, __) {
if (data is Loading) {
return const CircularProgressIndicator();
} else if (data is Error) {
return Center(child: Text(data.msg));
} else if (data is Content) {
return ListView.builder(
itemCount: data.data.length,
itemBuilder: (_, index) => Text(data.data[index]),
);
}
throw FallThroughError();
},
);