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)相同