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

时间:2021-01-08 07:08:42

标签: 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() => _CustomWidgetState();
}

class _CustomWidgetState extends State<CustomWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: widget.myWidget(name: 'ASAD'), //I want to achieve this
    );
  }
}

我正在传递另一个名为 StatefulWidgetProfile 作为该参数小部件。现在我想访问传递的小部件的构造函数。

import 'package:flutter/material.dart';

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

我在这里使用了 CustomWidget,它以小部件作为参数

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

我可以使用 typedef 完成类似的操作,但它开始抛出错误。

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.widget(name: 'ASAD'), //I'm able to access the constructor here but now I get an error.
    );
  }
}

错误

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

注意:基于我正在开发但无法共享代码的应用程序,我重新创建了这个场景并且就问题而言是相同的。

2 个答案:

答案 0 :(得分:0)

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

因此,当您传递 Profile Widget 时,您必须指定 name 参数的值!

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

答案 1 :(得分:0)

请尝试使用这个:

gnome-terminal -- bash -c \"./$fileNameWithoutExt\"