Flutter 为什么我的;“数据”&引用;“数据”;未使用ChangeNotifierProvider在ChangeNotifier类中更新?
我是个新手。 我想问为什么我的文本字段的onChange没有触发:“Provider.ofContext.updateData(newString);”。 my Provider.of(context).data的值不会更新,使用2条print语句时,始终只打印“called1” 代码如下: 进口“包装:颤振/材料.省道”; 导入“包:provider/provider.dart”Flutter 为什么我的;“数据”&引用;“数据”;未使用ChangeNotifierProvider在ChangeNotifier类中更新?,flutter,flutter-provider,flutter-change-notifier,Flutter,Flutter Provider,Flutter Change Notifier,我是个新手。 我想问为什么我的文本字段的onChange没有触发:“Provider.ofContext.updateData(newString);”。 my Provider.of(context).data的值不会更新,使用2条print语句时,始终只打印“called1” 代码如下: 进口“包装:颤振/材料.省道”; 导入“包:provider/provider.dart” void main() => runApp(MyApp()); class MyApp extends S
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Data>(
create: (_) => Data(),
lazy: false,
child: MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(Provider.of<Data>(context).data),
),
body: Level2(),
),
),
);
}
}
class Level2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
MyTextField(),
],
);
}
}
class MyTextField extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TextField(onChanged: (newString) {
print('called1');
Provider.of<Data>(context).updateData(newString);
print('called2');
});
}
}
class Data extends ChangeNotifier {
String data = '1234567890';
void updateData(newString) {
data = newString;
notifyListeners();
}
}
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>Data(),
懒惰:错,
孩子:MaterialApp(
家:脚手架(
appBar:appBar(
标题:文本(上下文数据的提供者),
),
正文:Level2(),
),
),
);
}
}
类Level2扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
MyTextField(),
],
);
}
}
类MyTextField扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
returntextfield(onChanged:(newString){
打印('called1');
Provider.of(context.updateData)(newString);
打印('called2');
});
}
}
类数据通知程序{
字符串数据='1234567890';
void updateData(新闻字符串){
数据=新闻字符串;
notifyListeners();
}
}
您试图在声明的同一小部件中访问提供者,这是不正确的做法,提供者必须在您访问的上述小部件中声明
此外,始终按变量使用提供者数据(如MyTextField小部件中所使用的),否则它将不起作用
以下代码可能有助于您了解更多信息
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: (_) => Data(),
child: MaterialApp(home: Level1()),
);
}
}
class Level1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(Provider.of<Data>(context).data),
),
body: Level2(),
);
}
}
class Level2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
MyTextField(),
],
);
}
}
class MyTextField extends StatelessWidget {
var dataprovider;
@override
Widget build(BuildContext context) {
dataprovider = Provider.of<Data>(context);
return TextField(
onChanged: (newString) {
print(dataprovider.data);
dataprovider.updateData(newString);
print('called2');
},
);
}
}
class Data extends ChangeNotifier {
String data = '1234567890';
void updateData(newString) {
print("cds");
data = newString;
notifyListeners();
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>Data(),
子项:MaterialApp(主项:Level1()),
);
}
}
类Level1扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(上下文数据的提供者),
),
正文:Level2(),
);
}
}
类Level2扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
MyTextField(),
],
);
}
}
类MyTextField扩展了无状态小部件{
var数据提供者;
@凌驾
小部件构建(构建上下文){
dataprovider=Provider.of(上下文);
返回文本字段(
onChanged:(新闻字符串){
打印(dataprovider.data);
dataprovider.updateData(新闻字符串);
打印('called2');
},
);
}
}
类数据通知程序{
字符串数据='1234567890';
void updateData(新闻字符串){
印刷品(“CD”);
数据=新闻字符串;
notifyListeners();
}
}
这很有效!非常感谢。因此,在每个需要数据提供者的小部件中,我都需要重新声明数据提供者,或者至少从父小部件传递数据提供者?不需要传递数据提供者。您可以访问我在MyTextField小部件中显示的内容,但请确保它的父小部件具有dataprovider。