【问题标题】:Tried to listen to a value exposed with provider, from outside of the widget tree in this simple provider error in this provider example在此提供程序示例中的此简单提供程序错误中,尝试从小部件树外部侦听提供程序公开的值
【发布时间】:2021-03-31 22:49:21
【问题描述】:

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

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();
  }
}

据我了解,我创建了数据类型的提供程序,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'

但它没有把我带到任何地方

【问题讨论】:

    标签: flutter provider


    【解决方案1】:

    这个错误是因为我们无法在 Provider 的 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!

    【讨论】:

      【解决方案2】:

      我设法找到了一个解决方案,将 on 设置为从此更改

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

      到这里

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

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

      【讨论】:

        【解决方案3】:

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

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

        到这里:

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

        【讨论】:

          猜你喜欢
          • 2020-05-21
          • 2021-11-11
          • 2020-09-10
          • 2020-12-14
          • 2020-01-13
          • 2020-09-27
          • 2020-07-26
          • 2019-11-29
          • 2019-05-19
          相关资源
          最近更新 更多