微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这个提供者示例中的这个简单的提供者错误中,试图从窗口小部件树的外部监听提供者公开的值

如何解决在这个提供者示例中的这个简单的提供者错误中,试图从窗口小部件树的外部监听提供者公开的值

所以我有点玩弄提供程序包和一切以了解如何使用它,我的代码是:

import 'package:Flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      create: (context) {
        return Data();
      },child: MaterialApp(
        title: 'Flutter Demo',theme: ThemeData(
          primarySwatch: Colors.blue,),home: Scaffold(
          appBar: AppBar(
            title: MyText(),body: Level1(),);
  }
}

class Level1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Level2(),);
  }
}

class Level2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(children: [
      MyTextField(),Level3(),]);
  }
}

class Level3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text(Provider.of<Data>(context).data);
  }
}

class MyText extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text(Provider.of<Data>(context).data);
  }
}

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TextField(
      onChanged: (newString) {
        Provider.of<Data>(context).changeString(newString);
      },);
  }
}

class Data extends ChangeNotifier {
  String data = 'starting value';

  void changeString(String newString) {
    data = newString;
    notifyListeners();
  }
}

据我所知,我用类型数据创建了提供程序,类 Level 3 和 MyTextField 和 MyText 都使用它,我的 TextField 基本上只是将其他 2 个类(MyText 和 MyTextField)的值更改为它获得的任何输入

我得到的完整错误是:

════════ Exception caught by widgets ═══════════════════════════════════════════
The following assertion was thrown while calling onChanged:
Tried to listen to a value exposed with provider,from outside of the widget tree.

This is likely caused by an event handler (like a button's onpressed) that called
Provider.of without passing `listen: false`.

To fix,write:
Provider.of<Data>(context,listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler,when the widget tree doesn't care about the value.

The context used was: MyTextField
'package:provider/src/provider.dart':
Failed assertion: line 265 pos 7: 'context.owner!.debugBuilding ||
          listen == false ||
          debugIsInInheritedProviderUpdate'

但它并没有让我去任何地方

解决方法

这个错误是因为我们不能在 Widget 树之外传递 Listen。 改变这个

   onChanged: (newString) {
        Provider.of<Data>(context).changeString(newString);
      },

到这里

  onChanged: (newString) {
    Provider.of<Data>(context,listen:false).changeString(newString);
  },

The Error Also Explaining the solution. Click Here to see Error!

,

我设法找到了一个解决方案,该解决方案将设置从this更改

   onChanged: (newString) {
        Provider.of<Data>(context).changeString(newString);
      },

我认为这是有效的,因为方法本身不需要听取更改,只需进行更改,我认为,随时纠正我

,

在最近版本的 dart 中,您必须向 listen: false 方法添加 of 参数。 有你的问题的解决方案:
更改此代码:

onChanged: (newString) {
  Provider.of<Data>(context).changeString(newString);
},

为此:

onChanged: (newString) {
   Provider.of<Data>(context,listen:false).changeString(newString);
},

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。