如何在类构造函数参数中动态传递窗口小部件

阿里·舒

这是我在Stackoverflow中的第一个问题。当我们将其作为类构造函数参数传递时,我试图在另一个StatefulWidget中调用一个小部件。

所以我有这个自定义小部件:

class MyTextWidget extends StatelessWidget {

  final String text;

  MyTextWidget({ @required this.text });

  @override
  Widget build(BuildContext context) {
    return Text(this.text);
  }

}

我想在另一个这样的小部件中使用(通过类构造函数参数传递)

import 'package:myproject/MyTextWidget.dart';
.
.
.
// Passing widget like this
child: Example(display: MyTextWidget,text: this.widget.text);
.
.
.
// And use this widget like this
this.widget.display(text: this.widget.text);

这是我的第一个代码:

class Example extends StatefulWidget {

  final Widget display;
  final String text;

  Example({ @required this.display, @required this.text });

  @override
  State<StatefulWidget> createState() {
    return ExampleState();
  }

}

class ExampleState extends State<Example> {

  @override
  Widget build(BuildContext context) {
      return this.widget.display(text: this.widget.text); // here we have error
  }

}

但是我有这个错误

The expression doesn't evaluate to a function, so it can't be invoked.dart(invocation_of_non_function_expression)

我意识到我需要对此问题进行typedef,所以我改进这样的代码:

typedef Widget DisplayType({ @required String text });

class Example extends StatefulWidget {

  final DisplayType display;
  final String text;

  Example({ @required this.display, @required this.text });

  @override
  State<StatefulWidget> createState() {
    return ExampleState();
  }

}

class ExampleState extends State<Example> {

  @override
  Widget build(BuildContext context) {
      return this.widget.display(text: this.widget.text);
  }

}

我们的错误已修复,但是当我想在另一个窗口小部件中传递MyTextWidget时:

child: Example(display: MyTextWidget,text: this.widget.text);

最后我得到这个错误:

The argument type 'Type' can't be assigned to the parameter type 'Widget Function({String text})'.dart(argument_type_not_assignable)

我该如何解决这个问题?

泰德·亨利

我认为您想display成为一个返回的构建器函数MyTextWidget

import 'package:flutter/material.dart';

Future<void> main() async {
  return runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(final BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(final BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Home")),
      body: Center(
        child: Example(
          display: ({@required final String text}) {
            assert(text != null);
            return MyTextWidget(text: text);
          },
          text: "some text",
        ),
      ),
    );
  }
}

class MyTextWidget extends StatelessWidget {
  final String text;

  MyTextWidget({@required this.text}) : assert(text != null);

  @override
  Widget build(final BuildContext context) {
    return Text(this.text);
  }
}

typedef Widget DisplayType({@required final String text});

class Example extends StatefulWidget {
  final DisplayType display;
  final String text;

  Example({
    @required this.display,
    @required this.text,
  })  : assert(display != null),
        assert(text != null);

  @override
  State<StatefulWidget> createState() {
    return ExampleState();
  }
}

class ExampleState extends State<Example> {
  @override
  Widget build(final BuildContext context) {
    return this.widget.display(text: this.widget.text);
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在kivy中通过不同的类或根窗口小部件传递变量?

如何将小部件构造函数作为参数传递给另一个小部件来构建

如何在自定义函数中创建动态窗口小部件并在viewDidLoad中调用它们?

如何在函数中传递动态参数

在构造函数中访问容器子窗口小部件尺寸

PyQt5使动态窗口小部件可单击并将参数传递给另一个函数

在initState或类构造函数中定义小部件,而不是在构建?

如何在通过注释自动装配的Spring bean中传递类构造函数参数

如何从子窗口小部件类中获取父窗口小部件的名称?

Flutter:如何在抽象构造函数中使用小部件

如何通过意图将数据从窗口小部件配置类传递到窗口小部件提供程序类?

如何从类构造函数传递模板参数

Flutter-如何在自定义类窗口小部件中更改变量

QT C ++-如何在另一个类中引用窗口小部件

如何在类构造函数中访问动态数组?

如何在Javascript构造函数中传递参数?

Flutter:如何在无状态窗口小部件中调用函数?

如何在Flutter中将参数传递给小部件

如何在 Tkinter 中使用 Toplevel 小部件传递类

如何在Python类构造函数中接受参数?

如何在Javascript中动态创建的函数中传递参数?

如何在 tkinter scale 小部件中调用函数并传递变量?

在Sitefinity中动态创建窗口小部件

如何在函数中传递动态数量的参数

如何在Column中更改子窗口小部件的位置?

如何在GTKSharp(MonoDevelop)中启用窗口小部件属性

Flutter-如何在继承的小部件中的已定义函数中使用参数

如何在Flutter中创建通用参数类型的小部件函数

如何正确地将值传递给Flutter中任何窗口小部件的事件处理函数?