Flutter 为什么我的;“数据”&引用;“数据”;未使用ChangeNotifierProvider在ChangeNotifier类中更新?

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

我是个新手。 我想问为什么我的文本字段的onChange没有触发:“Provider.ofContext.updateData(newString);”。 my Provider.of(context).data的值不会更新,使用2条print语句时,始终只打印“called1”

代码如下: 进口“包装:颤振/材料.省道”; 导入“包:provider/provider.dart”

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。