Provider.of <>是否通过ChangeNotifierProxyProvider返回null?

时间:2020-07-14 09:26:54

标签: flutter flutter-change-notifier

在下面的测试代码中,我有一个标志,用于确定是使用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仅在使用ChangeNotifierProvider时返回我的GroupEditorProvider实例。使用Change ChangeNotifierProxyProvider时,下面的groupEditorProvidernull

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

我已经使用Provider一段时间了,但对于ChangeNotifierProxyProvider还是陌生的,所以可能不了解基本知识。

1 个答案:

答案 0 :(得分:2)

结果是我不是从我的GroupEditorProvider.update函数返回提供者实例:

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

Flutter应该为此抛出异常吗?如果可以,我将发布到github。