Flutter - Как MultiProvider работает с провайдерами одного типа? - PullRequest
1 голос
/ 08 июня 2019

Например, я пытаюсь получить данные, испускаемые для нескольких потоков одновременно, но 2 или более из этих потоков испускают данные одного типа, скажем, строку.

Мой вопрос: возможно ли использовать MultiProvider и использовать несколько StreamProvider (или любого поставщика, но меня интересует этот случай) одного и того же типа, при этом все еще имея возможность доступа к данным, генерируемым каждым из них?

Решением для этого является использование StreamBuilder при использовании общих типов данных, но мне действительно нравится то, что MultiProvider предлагает с точки зрения более чистого кода.

Пример:

class MyScreen extends StatelessWidget {
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<String>(stream: Observable.just("stream1")),
        StreamProvider<String>(stream: Observable.just("stream2")),
        StreamProvider<String>(stream: Observable.just("stream3"))
      ],
      child: Builder(
        builder: (BuildContext context) {
          AsyncSnapshot<String> snapshot =
              Provider.of<AsyncSnapshot<String>>(context);
          String data = snapshot.data;
          return Text(data); 
        },
      ),
    );
  }
}

1 Ответ

3 голосов
/ 09 июня 2019

MultiProvider или нет, ничего не меняет.Если два провайдера имеют один и тот же тип, самый глубокий переопределяет значение.

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

Если вынеобходимо получить доступ ко всем этим значениям независимо, каждое из них должно иметь уникальный тип.

Например, вместо:

Provider<int>(
  value: 42,
  child: Provider<int>(
    value: 84,
    child: <something>
  ),
)

Вы можете сделать:

class Root {
  Root(this.value);

  final int value;
}

class Leaf {
  Root(this.value);

  final int value;
}


Provider<Root>(
  value: Root(42),
  child: Provider<Leaf>(
    value: Leaf(84),
    child: <something>
  ),
)

Это позволяет получить каждое значение независимо, используя:

Provider.of<Root>(context)
Provider.of<Leaf>(context);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...