[Flutter]:NotifyListener不从其他屏幕或弹出式工作 我正在使用提供商库来进行我的州管理,直到现在,一切正常。但是,我注意到,从另一个屏幕调用NotifyListeners(或诸如

问题描述 投票:0回答:1
时,我的UI不会通知。

我在The the中使用的方法看起来像这样,并将项目添加到列表视图中:

provider
对于UI,整个屏幕都包裹在一个

void addEntry(http.Response response) { Group group = Group.fromJson(jsonDecode(response.body)); groups.add(group); notifyListeners(); }

中。从屏幕上的按钮调用此方法正常工作,并且列表已更新。从使用

Consumer
创建的弹出窗口调用此方法不会更新UI。

如何确保通知UI的更改?
update#1

我有一个按钮,可以打电话
showModalBottomSheet
这样:

showModalBottomSheet

因此,它创建了一个带有单独的小部件的弹出窗口。当按下另一个按钮时,该单独的小部件依次执行此操作: showModalBottomSheet<void>( ... context: context, builder: (context) { return Padding( padding: MediaQuery.of(context).viewInsets, child: AddWidget(model: Provider.of<GroupsProvider>(context)), ); }, );

这种方法最终调用

widget.model.createGroup(name, icon);
。正如我所说的,如果没有弹出弹出,这一切都很好,但在弹出窗口中根本不起作用:/

	
topersheets之类的pop-ups很可能是从根导航器打开的,因此提供了不同的上下文,如果未在根导航器上方(即材料应用上方)上方创建您的提供商,它将导致此问题。 来自the的

addEntry

不是创建提供商的位置。 我可以想到2种解决方案:

在调用

context
之前,您可以创建对提供商的引用,然后将其传递给addwidget.

flutter flutter-packages
1个回答
4
投票
builder

使用
showModalBottomSheet
并用它包裹小部件。
showModalBottomSheet

    (2)确保其下方的小部件树可以访问同一提供商实例。对于新屏幕,您可以做:
  1. var provider = Provider.of<GroupsProvider>(context, listen:false);
    
    showModalBottomSheet<void>(
      ...
      context: context,
      builder: (context) {
        return Padding(
          padding: MediaQuery.of(context).viewInsets,
          child: AddWidget(model: provider),
        );
      },
    );
    
    
  2. 在调试模式下查看小部件检查员将帮助您更好地理解
	
© www.soinside.com 2019 - 2025. All rights reserved.