Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 无法使用Provider.of(上下文)调用类方法_Flutter_Dart_Flutter Dependencies_Dart Pub_Flutter Provider - Fatal编程技术网

Flutter 无法使用Provider.of(上下文)调用类方法

Flutter 无法使用Provider.of(上下文)调用类方法,flutter,dart,flutter-dependencies,dart-pub,flutter-provider,Flutter,Dart,Flutter Dependencies,Dart Pub,Flutter Provider,我正在学习使用此代码使用状态管理和提供程序包 import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNot

我正在学习使用此代码使用状态管理和提供程序包

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) => Data(),
      child: MaterialApp(
        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: <Widget>[
        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: (newText) {
        print("onChanged Start");
        Provider.of<Data>(context).changeString(newText); //this line troubling me
        print("onChanged End");
      },
    );
  }
}

class Data extends ChangeNotifier {
  String data = "Some Data";

  void changeString(String newString) {
    print("changeString Start");
    print(newString + " changeString Text");
    data = newString;
    notifyListeners();
    print("changeString End");
  }
}
预期为:

onChange Start
t
changeString Start
t changeString Text
changeString End
onChange End
(so on .....)
我使用的是
提供程序:^4.1.2
,在我下面的教程中,他们使用的是
提供程序:^3.0.0+1
因此,我将第10行中的
builder
更改为
create
,因为它显示了错误

我的颤振版本:

Flutter 1.17.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision e6b34c2b5c (4 weeks ago) • 2020-05-02 11:39:18 -0700
Engine • revision 540786dd51
Tools • Dart 2.8.1
PS:当我替换
Provider.of(context).changeString(newText)时,我的问题就解决了context.read().changeString(newText)编写代码>在本例的帮助下

但我不明白为什么Provider.of(context)不起作用,而context.read()起作用。 请给我解释一下

我很抱歉问了一个关于这个神圣社区的愚蠢问题。
感谢您仔细聆听/阅读我的问题。

如下更改文本字段的onchange函数:

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TextField(
      onChanged: (newText) {
        print("onChanged Start");
        Provider.of<Data>(context,listen:false).changeString(newText); //notice , listen default value is true
        print("onChanged End");
      },
    );
  }
}

类MyTextField扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回文本字段(
一旦更改:(新文本){
打印(“一次更改开始”);
Provider.of(context,listen:false).changeString(newText);//注意,listen默认值为true
打印(“更改端”);
},
);
}
}
关于
context.read()
你是对的,但是你应该知道
context.read()
相当于
Provider.of(context,listen:false)

正如在=>

  • context.watch()
    Provider.of(context)
    Provider.of(context,listen:true)
    相同,因为listen默认为true
  • context.read()
    Provider.of(context,listen:false)相同

如下更改文本字段的onChanged函数:

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TextField(
      onChanged: (newText) {
        print("onChanged Start");
        Provider.of<Data>(context,listen:false).changeString(newText); //notice , listen default value is true
        print("onChanged End");
      },
    );
  }
}

类MyTextField扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回文本字段(
一旦更改:(新文本){
打印(“一次更改开始”);
Provider.of(context,listen:false).changeString(newText);//注意,listen默认值为true
打印(“更改端”);
},
);
}
}
关于
context.read()
你是对的,但是你应该知道
context.read()
相当于
Provider.of(context,listen:false)

正如在=>

  • context.watch()
    Provider.of(context)
    Provider.of(context,listen:true)
    相同,因为listen默认为true
  • context.read()
    Provider.of(context,listen:false)相同