Provider.of <> возвращает null с помощью ChangeNotifierProxyProvider? - PullRequest
1 голос
/ 14 июля 2020

В моем тестовом коде ниже у меня есть флаг, который определяет, использовать ли ChangeNotifierProvider или ChangeNotifierProxyProvider. Когда я нажимаю RaisedButton, оба подхода правильно отображают мою GroupEditorPage.

const isUsingChangeNotifierProxyProvider = true;

class GroupsPage extends StatelessWidget {
  showGroupEditor(BuildContext context) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (_) {
        return isUsingChangeNotifierProxyProvider
            ? ChangeNotifierProxyProvider<CloudServicesProvider,
                GroupEditorProvider>(
                create: (_) => GroupEditorProvider(),
                update: (_, cloudServicesProvider, groupEditorProvider) =>
                    groupEditorProvider.update(cloudServicesProvider),
                child: GroupEditorPage(),
              )
            : ChangeNotifierProvider<GroupEditorProvider>(
                create: (_) => GroupEditorProvider(),
                child: GroupEditorPage(),
              );
      }),
    );
  }

  @override
  Widget build(BuildContext context) {
    return SliversPage(
      text: 'Testing',
      sliverList: SliverList(
        delegate: SliverChildBuilderDelegate(
          (BuildContext context, int index) {
            return RaisedButton(
              child: Text('+Create Group'),
              onPressed: () => showGroupEditor(context),
            );
          },
          childCount: 1,
        ),
      ),
    );
  }
}

Но Provider.of возвращает мой экземпляр GroupEditorProvider только при использовании ChangeNotifierProvider. Когда используется Change ChangeNotifierProxyProvider, groupEditorProvider ниже - null.

class GroupEditorPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final groupEditorProvider = Provider.of<GroupEditorProvider>(context);

Я использую Provider в течение некоторого времени, но я новичок в ChangeNotifierProxyProvider, поэтому, вероятно, не понимаю чего-то фундаментального.

1 Ответ

1 голос
/ 14 июля 2020

Оказывается, я не возвращал экземпляр провайдера из моей GroupEditorProvider.update функции:

  update(CloudServicesProvider cloudServicesProvider) {
    if (_cloudServicesProvider == null) {
      this._cloudServicesProvider = cloudServicesProvider;
    }
    return this; // <--- was missing
  }

Должен ли Flutter генерировать исключение для этого? Я выложу на github, если так.

...