是否有 notifyListeners 的替代方法

Is there an alternative to notifyListeners

是否有其他方法可以替代notifyListeners?

我必须更新提供商,但要用另一种方式。

我可以提供两种方法。例如,在这种情况下,我在 Provider 的帮助下更改了一个文本字段:

1.值通知程序 + 提供程序

供应商classTextProvider

class TextProvider extends ChangeNotifier {
  final ValueNotifier<String> _textNotifier = ValueNotifier<String>('');
  ValueNotifier<String> get text => _textNotifier;

  void setText(String text) => _textNotifier.value = text;
}

Provider 上下文下的任何位置:

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。函数回调 + 提供者

供应商classTextProvider

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

Provider 上下文下的任何位置:

...

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,
            ),
          ],
        ),

...

}