Флаттер: StreamProvider catchError, как - PullRequest
0 голосов
/ 09 июля 2019

Мне было интересно, может ли кто-нибудь показать мне, как реализовать свойство "catchError" Flutter StreamProvider?

Пример кода ниже для добавления к:

StreamProvider<LocationModelNormal>.value(
    initialData: LocationModelNormal.initialData(),
    stream: locationStreamInstance.specificLocation(_secondWonder),
    catchError: ?????????
),
class LocationModelNormal {
  final String name;
  LocationModelNormal({
    this.name
  });
  factory LocationModelNormal.fromMap(Map<String, dynamic> data) {
    return LocationModelNormal(
      name: data['name'] ?? '',

    );
  }
  factory LocationModelNormal.initialData() {
    return LocationModelNormal(
      name: '',
    );
  }
}

1 Ответ

0 голосов
/ 10 июля 2019

Вы хотите смоделировать свои данные, используя закрытые классы:

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();
  },
);
...