首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止提供者处理模型?

如何防止提供者处理模型?
EN

Stack Overflow用户
提问于 2019-08-20 20:43:56
回答 1查看 1.1K关注 0票数 0

在app主页上,我设置了Model2,使API调用数据。然后用户可以导航到其他页面(Navigator.push)。但是我想在用户按下( Model2 ) (_onBackPress())时从_onBackPress()调用API,这样就可以在主页上刷新数据。当我打电话时,它会出错:

未处理的异常:错误:无法找到此消费者Widget之上的正确提供程序

如果我将Consumer添加到Page2中,则会产生错误:

错误:找不到正确的提供程序在此消费品Widget之上

主页中的StatefulWidget

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
return ChangeNotifierProxyProvider<Model1, Model2>(
initialBuilder: (_) => Model2(),
  builder: (_, model1, model2) => model2
    ..string = model1.string,
),
  child: Consumer<Model2>(
    builder: (context, model2, _) =>

...
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondRoute(context: context)),

在Page2中:

代码语言:javascript
复制
  final context;

  Page2State({Key key, this.context});
...

//    Consumer<Model2>(
//    builder: (context, model2, _) =>
    ...
          onWillPop: () => _onBackPress(context),
...

Future<void> _onBackPress(context) async {

final model2 = Provider.of<Model2>(context, listen: false);

  return showDialog<void>(
    context: context,
    barrierDismissible: false, 
    builder: (BuildContext context) {
      return 


    Provider.value(value: model2, child:


AlertDialog(
        title: Text('Back'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              Text('Go back'),
            ],
          ),
        ),
        actions: <Widget>[
          FlatButton(
            child: Text('OK'),
            onPressed: () async {
await model2.getData();

              Navigator.of(context).pop();
            },
          ),
        ],
),
      );
    },
  );
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-22 13:34:41

也许有点麻烦,但是在您的模型/提供程序类上重写dispose()方法似乎有效。

例如,如果您有一个作为视图提供者提供的视图模型:

代码语言:javascript
复制
class View extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      lazy: false,
      create: (context) => ViewModel(),
      builder: (context, child) {
        return Scaffold(
...
}
代码语言:javascript
复制
class ViewModel with ChangeNotifier {
...
  @override
  // ignore: must_call_super
  void dispose() {}
}

这将阻止提供程序机制自动释放模型。当然,现在您有了一个无用的dispose()方法,因此您可能需要实现一些其他方法,在需要时调用super.dispose()来释放资源:

代码语言:javascript
复制
  void myDispose() {
    super.dispose();
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57581287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档