为什么 Provider.of<> 没有"listen: false"就不起作用?



我有一个简单的小部件树,并试图弄清楚为什么是Provider.of<gt;((在手势检测器中不起作用,onTap((回调。

这是我的型号:

class ShareObject {
int intField;
ShareObject(this.intField);
}
class ShareObjectProvider extends ShareObject with ChangeNotifier {
ShareObjectProvider(super.intField);
void increment() {
intField++;
notifyListeners();
}
}

这是我的简单树,在这里我尝试从模型调用方法:

class ParentWidgetState extends State<ParentWidget> {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => ShareObjectProvider(0),
child: Scaffold(
body: const WidgetThree(),
),
);
}
}
class WidgetThree extends StatelessWidget {
const WidgetThree({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: SizedBox(
width: 200,
height: 200,
child: Container(
color: Colors.deepOrange,
child: Center(
child: GestureDetector(
onTap: () =>
{Provider.of<ShareObjectProvider>(context).increment()},
child: Text(
"Test ${Provider.of<ShareObjectProvider>(context).intField}",
style: const TextStyle(color: Colors.blueAccent),
),
)
),
),
),
);
}
}

为什么当我更改为Provider.of<ShareObjectProvider>(context, listen: false).increment()时,它开始正常工作?

根据文档,

Provider.of<T>(context)

像手表一样工作,这使得小部件能够再次重建

侦听:错误

使其像读取一样工作

在您的情况下:

late ShareObjectProvider provider;

void initState() {
super.initState();
provider = Provider.of<ShareObjectProvider>(listen: false);
}

然后在GestureDetector中使用

这是供应商文档的链接,上面提到了

您的语法不适合提供程序。您需要添加listen:true或listen:false。

Provider.of<ShareObjectProvider>(context, listen: false).increment()

最新更新