Flutter 将StatefulWidget作为参数传递并访问其构造函数

Flutter 将StatefulWidget作为参数传递并访问其构造函数,flutter,dart,flutter-layout,flutter-widget,statefulwidget,Flutter,Dart,Flutter Layout,Flutter Widget,Statefulwidget,我创建了一个自定义的StatefulWidget,它将Widget作为参数 import 'package:flutter/material.dart'; class CustomWidget extends StatefulWidget { final Widget myWidget; CustomWidget({this.myWidget}); @override _CustomWidgetState createState() => _CustomWid

我创建了一个自定义的
StatefulWidget
,它将
Widget
作为参数

import 'package:flutter/material.dart';

class CustomWidget extends StatefulWidget {
  
  final Widget myWidget;
  CustomWidget({this.myWidget});
  
  @override
  _CustomWidgetState createState() => _CustomWidgetState();
}

class _CustomWidgetState extends State<CustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: widget.myWidget(name: 'ASAD'), //I want to achieve this
    );
  }
}
我使用的是
CustomWidget
,它将widget作为参数

    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }

    class _MyHomePageState extends State<MyHomePage> {
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: CustomWidget(myWidget: Profile(),) //I don't want to pass the argument here
        );
      }
    }
错误

error: The argument type 'Profile' can't be assigned to the parameter type 'Widget Function({String name})'. (argument_type_not_assignable

注意:基于我正在使用但无法共享代码的应用程序,我重新创建了此场景,就问题而言也是如此。

请尝试在CustomWidget小部件中更改此行,
child:widget.widget(name:'ASAD')
,仅针对您正在传递的小部件,而不放置
(name:'ASAD')

因此,当您传递Profile小部件时,必须指定name参数的值

body: CustomWidget(myWidget: Profile(name: 'ASAD'),)

尝试在CustomWidget小部件中更改此行,
child:widget.widget(名称:'ASAD')
,只针对您正在传递的小部件,而不放置
(名称:'ASAD')

因此,当您传递Profile小部件时,必须指定name参数的值

body: CustomWidget(myWidget: Profile(name: 'ASAD'),)

请尝试使用以下选项:

import 'package:flutter/material.dart';

typedef CustomCallBack = Widget Function(String name);

class CustomWidget extends StatefulWidget {
  final CustomCallBack myWidget;

  CustomWidget({this.myWidget});

  @override
  _CustomWidgetState createState() => _CustomWidgetState();
}

class _CustomWidgetState extends State<CustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: widget.myWidget(
          'ASAD'), //I'm able to access the constructor here but now I get an error.
    );
  }
}

class Profile extends StatefulWidget {
  final String name;

  Profile({this.name});

  @override
  _ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('${widget.name}'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: CustomWidget(
      myWidget: (name) => Profile(
        name: name,
      ),
    ) //I don't want to pass the argument here
        );
  }
}

导入“包装:颤振/材料.省道”;
typedef CustomCallBack=小部件函数(字符串名称);
类CustomWidget扩展了StatefulWidget{
最终定制回调myWidget;
CustomWidget({this.myWidget});
@凌驾
_CustomWidgetState createState()=>\u CustomWidgetState();
}
类_CustomWidgetState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
子:widget.myWidget(
'ASAD'),//我可以在这里访问构造函数,但现在我得到一个错误。
);
}
}
类配置文件扩展了StatefulWidget{
最后的字符串名;
配置文件({this.name});
@凌驾
_ProfileState createState()=>\u ProfileState();
}
类_ProfileState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回中心(
子项:文本(“${widget.name}”),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:CustomWidget(
myWidget:(名称)=>配置文件(
姓名:姓名,,
),
)//我不想在这里传递参数
);
}
}

请尝试使用以下方法:

import 'package:flutter/material.dart';

typedef CustomCallBack = Widget Function(String name);

class CustomWidget extends StatefulWidget {
  final CustomCallBack myWidget;

  CustomWidget({this.myWidget});

  @override
  _CustomWidgetState createState() => _CustomWidgetState();
}

class _CustomWidgetState extends State<CustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: widget.myWidget(
          'ASAD'), //I'm able to access the constructor here but now I get an error.
    );
  }
}

class Profile extends StatefulWidget {
  final String name;

  Profile({this.name});

  @override
  _ProfileState createState() => _ProfileState();
}

class _ProfileState extends State<Profile> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('${widget.name}'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: CustomWidget(
      myWidget: (name) => Profile(
        name: name,
      ),
    ) //I don't want to pass the argument here
        );
  }
}

导入“包装:颤振/材料.省道”;
typedef CustomCallBack=小部件函数(字符串名称);
类CustomWidget扩展了StatefulWidget{
最终定制回调myWidget;
CustomWidget({this.myWidget});
@凌驾
_CustomWidgetState createState()=>\u CustomWidgetState();
}
类_CustomWidgetState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
子:widget.myWidget(
'ASAD'),//我可以在这里访问构造函数,但现在我得到一个错误。
);
}
}
类配置文件扩展了StatefulWidget{
最后的字符串名;
配置文件({this.name});
@凌驾
_ProfileState createState()=>\u ProfileState();
}
类_ProfileState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回中心(
子项:文本(“${widget.name}”),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:CustomWidget(
myWidget:(名称)=>配置文件(
姓名:姓名,,
),
)//我不想在这里传递参数
);
}
}

我不能,我的要求不允许我这样做。我不能,我的要求不允许我这样做。我能看到的唯一区别是命名参数@是的,那可以解决你的问题!我能看到的唯一区别是命名参数@是的,那可以解决你的问题!