如何将flutter riverpodref.read()函数传递给另一个小部件

mdfafbf1  于 2023-04-13  发布在  Flutter
关注(0)|答案(2)|浏览(124)

这是我的自定义可重用Widget代码。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class MyFloatingActionButton extends ConsumerWidget {
  final Function(ProviderRef ref) onPressed;

  MyFloatingActionButton(this.onPressed);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return FloatingActionButton(
      onPressed: () => onPressed,
      tooltip: 'Increment',
      child: Icon(Icons.add),
    );
  }
}

父控件如下:

floatingActionButton: MyFloatingActionButton((ref) => ref.read(myProvider)._increase())

这里是myProvider

class CountNotifier extends ChangeNotifier {
  int num = 0;
  void _increase() {
    num ++;
    notifyListeners();
  }
}
final myProvider = ChangeNotifierProvider((ref) {
  return CountNotifier();
});

在将函数传递给它的子控件后,它就不再工作了。但是在父控件中,它工作得很好。
我希望将ref.read()函数传递给任何子部件。

smtd7mpg

smtd7mpg1#

回调函数不会作为代码调用:

FloatingActionButton(
  onPressed: () => onPressed,
  tooltip: 'Increment',
  child: Icon(Icons.add),
);

因为() => onPressed表示函数总是返回一个值,这个值就是你的回调函数。你从来没有调用过你的回调函数!
你应该这样称呼它:() => onPress(ref)
我不知道你想实现什么,但我的建议是只使用父部件中的ref,不要手工传递ref

6gpjuf90

6gpjuf902#

试试这样:

// parent:
floatingActionButton: MyFloatingActionButton(ref.read(myProvider)._increase)

孩子:

class MyFloatingActionButton extends ConsumerWidget {
  const MyFloatingActionButton(this.onPressed);

  final Function() onPressed;

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return FloatingActionButton(
      onPressed: onPressed,
      tooltip: 'Increment',
      child: Icon(Icons.add),
    );
  }
}

相关问题