gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:57:11 26 4
gpt4 key购买 nike

这是我在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);
}
}

关于oop - 如何在类构造函数参数中动态传递窗口小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com