【发布时间】:2021-11-06 05:59:01
【问题描述】:
还有其他方法可以替代 notifyListeners 吗?
我必须以另一种方式更新提供程序。
【问题讨论】:
-
是不是因为你不想让所有其他的监听器都监听,而只是想要一个特定的属性来监听?
-
是的,是....
标签: flutter dart flutter-provider
还有其他方法可以替代 notifyListeners 吗?
我必须以另一种方式更新提供程序。
【问题讨论】:
标签: flutter dart flutter-provider
我可以提供两种方法。例如,在这种情况下,我在 Provider 的帮助下更改了一个文本字段:
1.值通知者 + 提供者
提供者类TextProvider
class TextProvider extends ChangeNotifier {
final ValueNotifier<String> _textNotifier = ValueNotifier<String>('');
ValueNotifier<String> get text => _textNotifier;
void setText(String text) => _textNotifier.value = text;
}
提供者上下文之下的任何地方:
Column(
children: [
TextField(
onChanged: (value) {
Provider.of<TextProvider>(context, listen: false)
.setText(value);
},
),
SizedBox(
height: 20,
),
ValueListenableBuilder<String>(
valueListenable:
Provider.of<TextProvider>(context, listen: false).text,
builder: (context, value, _) => Text(
'$value',
style: Theme.of(context).textTheme.headline4,
),
),
],
2。函数回调+提供者
提供者类TextProvider
typedef TextCallback = void Function(String text);
class TextProvider extends ChangeNotifier {
final _textListener = ObserverList<TextCallback>();
void textListener(TextCallback callback) => _textListener.add(callback);
void _notifyTextChanged(String text) {
for (final listener in _textListener) {
listener.call(text);
}
//notifyListeners(); //Can call if you want to notify other listeners
}
void triggerTextChange(String text) => _notifyTextChanged(text);
}
提供者上下文之下的任何地方:
...
class _MyHomePageState extends State<MyHomePage> {
late final TextProvider provider;
String? text;
@override
void initState() {
super.initState();
provider = Provider.of<TextProvider>(context, listen: false);
provider.textListener((String s) {
setState(() {
text = s;
});
});
}
...
@override
Widget build(BuildContext context) {
...
child: Column(
children: [
TextField(
onChanged: (value) {
provider.triggerTextChange(value);
},
),
SizedBox(
height: 20,
),
Text(
'$text',
style: Theme.of(context).textTheme.headline4,
),
],
),
...
}
【讨论】: