Flutter Provider 在导航时不更新 UI

问题描述 投票:0回答:1

我在屏幕 1 中显示 deviceName。 我尝试从屏幕 2 设置 deviceName,然后导航回来。 在 setDeviceName 表示变量已更新后,即使在我的打印中,UI 也不会更新。

我导航的代码:

globalStateProvider.setDeviceName('name');
print(globalStateProvider.deviceName); (prints new name)
Navigator.pushReplacement(context, WidgetAnimator(MainWidget(), 0));

我尝试过的:

import 'package:flutter/cupertino.dart';

class GlobalStateProvider with ChangeNotifier {
  String _deviceName = '';

  String get deviceName => _deviceName;

  setDeviceName(String newName) {
    _deviceName = newName;
    notifyListeners();
  }

}
// Global value to access whole app
final globalStateProvider = GlobalStateProvider();

然后我就从我的文件中调用:

globalStateProvider.setDeviceName('name');

globalStateProvider.deviceName;

其他尝试:

在我需要的地方声明 globalStateProvider。

final globalStateProvider =
        Provider.of<GlobalStateProvider>(context, listen: false);

因此,在我想要使用它的所有小部件中,我只需声明它并调用函数。但这不起作用。

其他尝试:

Provider.of<GlobalStateProvider>(context, listen: false).setDeviceName('');

Consumer<GlobalStateProvider>(builder: (context, state, child) {
        return Text(state.deviceName), 
      }),

仍然没有任何作用...

flutter state-management
1个回答
0
投票

你不能使用

final globalStateProvider = GlobalStateProvider();

provider
的工作方式如下:它提供 BuildContext
 中小组件树
下的值。您需要首先在应用程序根目录的某个位置使用
globalStateProvider
Provider
小部件提供
Provider.value
,以便能够侦听其更改。

但是,当您使用

ChangeNotifier
时,您将专门需要一个
ChangeNotifierProvider
。不过,对于您的情况,如果您确实希望将
globalStateProvider
作为全局变量,则可以仅使用
ListenableBuilder
并将其作为
listenable
传递。因此,每当此可听对象调用
ListenableBuilder.builder
时,都会重建
notifyListeners
中的子树返回。

© www.soinside.com 2019 - 2024. All rights reserved.