【发布时间】:2021-03-31 22:49:21
【问题描述】:
所以我有点在玩提供程序包和一切以了解如何使用它,我的代码是:
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) {
return Data();
},
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
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: [
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: (newString) {
Provider.of<Data>(context).changeString(newString);
},
);
}
}
class Data extends ChangeNotifier {
String data = 'starting value';
void changeString(String newString) {
data = newString;
notifyListeners();
}
}
据我了解,我创建了数据类型的提供程序,3 级和 MyTextField 和 MyText 类都使用它,我的 TextField 基本上只是将其他 2 个类(MyText 和 MyTextField)的值更改为它得到的任何输入
我得到的完整错误是:
════════ Exception caught by widgets ═══════════════════════════════════════════
The following assertion was thrown while calling onChanged:
Tried to listen to a value exposed with provider, from outside of the widget tree.
This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.
To fix, write:
Provider.of<Data>(context, listen: false);
It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.
The context used was: MyTextField
'package:provider/src/provider.dart':
Failed assertion: line 265 pos 7: 'context.owner!.debugBuilding ||
listen == false ||
debugIsInInheritedProviderUpdate'
但它没有把我带到任何地方
【问题讨论】: