【问题标题】:Is there an alternative to notifyListeners是否有替代 notifyListeners 的方法
【发布时间】:2021-11-06 05:59:01
【问题描述】:

还有其他方法可以替代 notifyListeners 吗?

我必须以另一种方式更新提供程序。

【问题讨论】:

  • 是不是因为你不想让所有其他的监听器都监听,而只是想要一个特定的属性来监听?
  • 是的,是....

标签: flutter dart flutter-provider


【解决方案1】:

我可以提供两种方法。例如,在这种情况下,我在 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,
            ),
          ],
        ),

...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2010-09-20
    • 2021-08-29
    相关资源
    最近更新 更多