[英]Passing Scanner object as a constructor parameter to the UserInterface class
[英]How passing widget dynamically in class constructor parameter
這是我在 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);
}
}
您不需要向下傳遞小部件,只需將其導入到要使用它的類中即可。
當你想實例化它時,你需要使用括號MyTextWidget()
。
在調用傳遞給有狀態小部件的參數時,您不需要使用this
,只需widget.text
。
你似乎對 Flutter 有一些誤解。 在極少數情況下您需要使用this
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.