Flutter Provider-小部件不订阅更新

时间:2019-12-20 16:40:56

标签: flutter provider

我希望我的小部件侦听对提供的FormViewModel,即ChangNotifier的更新。在窗口小部件中,使用以下命令访问和订阅通知程序:

FormViewModel model = Provider.of<FormViewModel>(context);

FormViewModel使用以下方法创建:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Nothing New';
    return MultiProvider(
      providers: [
        Provider<FormViewModel>(
          create: (_) => FormViewModel(Loading(), FirebaseService(), ImageUploadService()),
        )
      ],
      child: MaterialApp(
        title: "XX",
        home: Scaffold(
          appBar: AppBar(
            title: Text(appTitle),
          ),
          body: MyCustomForm(),
        ),
      ),
    );
  }
}

FormViewModel扩展了BaseViewModel。我已验证状态设置正确,但以下打印语句中没有侦听器:

class BaseViewModel<T> with ChangeNotifier {

  T _state;
  T get state => _state;

  BaseViewModel(T viewState) {
    setState(viewState);
  }

  void setState(T viewState) {
    print("state change: $viewState");
    _state = viewState;
    print('has listeners: $hasListeners');
    notifyListeners();
    handleSideEffects(state);
  }

  @protected
  void handleSideEffects(T _state) {
    print("handle side effects for: $_state");
  }

  @protected
  void handleError(Object e) {
    print(e);
  }
}

1 个答案:

答案 0 :(得分:1)

您使用了错误的提供程序。

如果您的对象是ChangeNotifierProvider,则您应该使用ChangeNotifier,并且希望提供者在发生更改时重建依赖关系。

ChangeNotifierProvider<FormViewModel>(
  create: (_) => FormViewModel(Loading(), FirebaseService(), ImageUploadService()),
)