【问题标题】:How to pass widget constructor as a parameter for another widget to build如何将小部件构造函数作为参数传递给另一个小部件以构建
【发布时间】:2019-04-18 01:16:11
【问题描述】:

有没有办法将一个小部件作为参数传递给另一个?

我的代码与此类似,有两个 TextWidget 类型为 BoldWidgetItalicWidget

abstract class TextWidget extends StatelessWidget {
  final String text;

  TextWidget({
    @required this.text,
  });
}

class BoldWidget extends TextWidget {
  @override
  Widget build(BuildContext context) {
    return Text(this.text, style: TextStyle(fontWeight: FontWeight.bold),);
  }
}

class ItalicWidget extends TextWidget {
  @override
  Widget build(BuildContext context) {
    return Text(this.text, style: TextStyle(fontStyle: FontStyle.italic),);
  }
}

在运行时,我想将 TextWidget 作为参数传递给另一个小部件 (TextDisplay),如下所示:

class TextDisplay extends StatelessWidget {
  final TextWidget widget;
  final String string;

  const TextDisplay({Key key, this.widget, this.string}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return widget(string);
  }
}

在上面的代码中不起作用的是widget(string),错误消息“'widget' is not a function”。

如何将一个小部件作为另一个参数传递,以便它可以由另一个类构造?

在将TextWidget 传递给TextDisplay 之前,我的实际代码无法构建它,因为TextDisplay 需要将一些参数应用于TextWidget

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    您可以使用 typedef 来使用回调模式:

      typedef CustomCallBack = TextWidget Function(String value);
    
      class TextDisplay extends StatelessWidget {
        final CustomCallBack widget;
        final String string;
    
        const TextDisplay({Key key, this.widget, this.string}) : super(key: key);
    
        @override
        Widget build(BuildContext context) {
          return widget(string);
        }
      }
    

    【讨论】:

    • 我试过这个解决方案,很好,但现在我收到这个错误The argument type 'ProfileCards' can't be assigned to the parameter type 'Widget Function<T>({T data})'.如何解决这个问题?
    • @ASADHAMEED 我不知道这是否会帮助你,但我一直在努力让它工作,直到我意识到我必须将小部件作为一个函数发送。我很难解释,但也许这会有所帮助: TypeDef:typedef OpenWidgetType = Widget Function(); 类中的参数:final OpenWidgetType openWidget; 调用 Widget 时,输入参数为:openWidget: () { return WidgetToPass(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多