gpt4 book ai didi

flutter - 无法使用Provider.of(context)调用类方法

转载 作者:行者123 更新时间:2023-12-03 04:21:56 25 4
gpt4 key购买 nike

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

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");
}
}

在运行应用程序时,AppBar Text MyText()和Level 3 Text Text()可以正常工作。
就像我在代码中更改 data的值一样,然后重新启动 data中更新的更改并也反射(reflect)在应用程序中。

我还创建了 MyTextFiled(),其中发生的任何更改都应该在 data中进行更新,但是 changeString()在第64行没有调用 Provider.of<Data>(context)方法。

这是我在TextField中键入“测试”时的控制台输出。
onChange Start
t
onChange Start
te
onChange Start
tes
onChange Start
test

预期为:
onChange Start
t
changeString Start
t changeString Text
changeString End
onChange End
(so on .....)

我正在使用 provider: ^4.1.2,在本教程中(我正在关注),他们使用了 provider: ^3.0.0+1因此,在第10行中,我将 builder更改为 create,因为它显示了错误。

我的Flutter版本:
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 Example的帮助下将 Provider.of<Data>(context).changeString(newText);替换为 context.read<Data>().changeString(newText);时,我的问题得到解决

但是我不明白为什么Provider.of(context)不起作用,而context.read()有效。
请给我启示。

我对这个神圣的社区提出一个愚蠢的问题表示歉意。
感谢您仔细听/读我的问题。

最佳答案

像这样更改您的TextField的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");
},
);
}
}


您对 context.read<Data>()是正确的,但您应该知道 context.read<T>()Provider.of<T>(context,listen:false)等效

documentation =>中所述
  • context.watch<T>()Provider.of<T>(context)Provider.of<T>(context,listen:true)相同,因为默认情况下listen为true
  • context.read<T>()Provider.of<T>(context,listen:false)相同
  • 关于flutter - 无法使用Provider.of(context)调用类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62117820/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com