flutter 将具有动态值的函数传递给子窗口小部件

dz6r00yl  于 2023-05-01  发布在  Flutter
关注(0)|答案(2)|浏览(117)

我需要有一个父部件此功能

User? _user;

void _onChangeUser(User? user) {
  setState(() {
    _user = user;
  });
}

我想把它传递给一个接收一个带有动态参数的函数的子部件,所以在父部件构建方法上我这样做:

return _ChildView(
   onPress:  _onChangeUser,
);

在我的子部件上,我想传递这个函数,但是让它有一个动态参数,像这样:

class _ChildView extends StatelessWidget {
  const _ChildView({
    Key? key,
    required this.onPress,
}) : super(key: key);

final ValueChanged<dynamic> onPress;

然而,Flutter不允许这样做。参数类型'void Function(User?)'不能分配给参数类型'void Function(dynamic)'。我希望能够分配一个用户?一个动态值。
我该怎么做?
我也试过

final Function(dynamic) onPress;

但也不管用

2ledvvac

2ledvvac1#

你的函数在_ChildView中有一个dynamic类型作为参数,而你的函数_onChangeUser有一个User?类型作为参数。
如果希望_ChildView中的onPress函数在每次调用时接受不同类型的参数,可以将其定义为接受泛型类型T,如下所示:

class _ParentViewState extends State<ParentView> {
      User? _user;

      void _onChangeUser(User? user) {
        setState(() {
          _user = user;
        });
      }

      @override
      Widget build(BuildContext context) {
        return _ChildView(onPress: _onChangeUser);
      }
    }

    class _ChildView<T> extends StatelessWidget {
      final Function(T) onPress;
      const _ChildView({Key? key, required this.onPress}) : super(key: key);

      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
vd2z7a6w

vd2z7a6w2#

变更

final Function(dynamic) onPress

转换为常规函数类型

final Function onPress

然后用

onPress.call();

相关问题