Втекает, выходит…

Как прослушивать данные в реальном времени отдельно от StreamBuilder….? Хм…..

Использование селектора в Провайдере



Все в одном ресурсе Flutter: https://flatteredwithflutter.com/how-to-use-stream-provider-in-flutter/

Начинать…

Недавно команда Flutter анонсировала пакет управления состоянием под названием Provider на Google I / O 2019.

Как использовать…

Добавьте эту зависимость в свой pubspec.yaml.

provider: ^2.0.0+1

Слушайте данные…

У нас был StreamBuilder во Flutter…

Несомненно, лучший виджет для прослушивания данных в реальном времени…

Это требует двух аргументов

  • Поток
  • Конструктор, который может преобразовывать элементы потока в виджеты.
StreamBuilder(
  stream: //YOUR STREAM, 
  builder: (BuildContext context, AsyncSnapshot snapshot){ 
  return //YOUR CHILD; 
})

Теперь у нас также есть StreamProvider …… .. :)

Это исходит из пакета провайдера.

StreamProvider<LocationModelNormal>.value(
    initialData: LocationModelNormal.initialData(),
    stream: locationStreamInstance.specificLocation(_secondWonder),
    child: SecondStreamWidget(),
),
  1. В StreamProvider нам нужно указать тип объекта, который мы слушаем….

В приведенном выше случае LocationModelNormal (класс модели)…

LocationModelNormal класс (ниже)….

class LocationModelNormal {
  final String name;

  final String url;

  final GeoPoint coordinates;

  final String videoURL;

  LocationModelNormal({
    this.name,
    this.url,
    this.coordinates,
    this.videoURL,
  });

  factory LocationModelNormal.fromMap(Map<String, dynamic> data) {
    return LocationModelNormal(
      name: data['name'] ?? '',
      url: data['url'] ?? '',
      coordinates: data['location'] ?? null,
      videoURL: data['link'] ?? '',
    );
  }

  factory LocationModelNormal.initialData() {
    return LocationModelNormal(
      coordinates: null,
      name: '',
      videoURL: '',
      url:'',
    );
  }
}

2. Затем мы предоставляем initialData.

В нашем случае LocationModelNormal.initialData ()…. (См. Фрагмент выше)

3. Наконец, мы предоставляем дочерний виджет.

В нашем случае SecondStreamWidget ()…

Очень похоже на StreamBuilder, верно !!!!!!!!! :)

Доступ к данным в Child…

Теперь, когда у нас настроен StreamProvider, нам нужно показать результаты в дочернем элементе…

Для доступа к данным (у вашего ребенка)…

var data = Provider.of<LocationModelNormal>(context);

Здесь мы указали результат, ожидаемый от нашего потока, используя Provider.of ‹Type› (context) ..

В нашем случае Type = LocationModelNormal.

В действии,

Padding(
     padding: const EdgeInsets.symmetric(horizontal: 8.0),
     child: Text(‘${data.name}'),
),

где данные = указанная выше переменная…

Слушайте изменения в сети…

При внедрении большого количества значений в большие приложения Provider может быстро стать довольно вложенным, поэтому у нас есть MultiProvider

MultiProvider(
  providers: [
    Provider<Foo>.value(value: foo),
    Provider<Bar>.value(value: bar),
    Provider<Baz>.value(value: baz),
  ],
  child: someWidget,
)

Вариант использования…

В нашем примере мы слушаем изменения сети, прежде чем загружать другие потоки… ..

Как сделать,

  1. Установите зависимость подключение
  2. Оберните свое MaterialApp с помощью MultiProvider
return MultiProvider(
  providers: [
    StreamProvider<ConnectionStatus>.value(
           stream:streamConnectivityService().connectivityController.stream,
    ),
  ],
  child: MaterialApp(
     home: Home(),
  ),
);

Здесь класс модели - ConnectionStatus

Теперь ваш домашний виджет получит изменения в подключении к сети ... Вы можете соответственно отображать различные пользовательские интерфейсы ...

Испускаемые значения….

Wi-Fi, офлайн или мобильные данные….

Widget build(BuildContext context) {
    var network = Provider.of<ConnectionStatus>(context);
    final _width = MediaQuery.of(context).size.width;
    final _height = MediaQuery.of(context).size.height;

    if (network == ConnectionStatus.wifi ||
        network == ConnectionStatus.mobileData) {
      return Container(
        child: child,
      );
    }

    return Container(
      height: _height,
      width: _width,
      child: Text('YOU ARE OFFLINE'),
    );
}

Статьи, связанные с Flutter:









Src-код: https://github.com/AseemWangoo/flutter_programs/blob/master/provider.zip