如何解决当我们看到人们在 dart 中调用 widget 时,这意味着什么?
我可以知道它实际上在做什么吗?
class _MyOwnClassstate extends State<MyOwnClass> {
@override
Widget build(BuildContext context) {
return ListTile(
title: Container(
child: Column(children: makeWidgetChildren(**widget.jsonObject)**),),);
}
}
解决方法
在 Flutter 的 StatefulWidget
中,我们有以下架构。
你有一个这样的StatefulWidget
,
class MyOwnClass extends StatefulWidget {
State createState () => _MyOwnClassState();
}
而且你的State
有一个StatefulWidget
类,就像这样,
class _MyOwnClassState extends State<MyOwnClass> {
}
现在,State
类旨在容纳可能会发生变化的变量,以便重建您的 UI。
因此您可以在您的 State
中包含可以使用 setState
更新的变量。
但是如果您有一些不会更改的数据并且您想避免将它们放入 State
类中怎么办。
这就是您的 StatefulWidget
发挥作用的地方。
您可以在 MyOwnClass
中存储变量,widget
类中的 State
变量为您提供了访问它们的方法。
例如
class MyOwnClass extends StatefulWidget {
int numberThatDoesntChange = 1;
State createState () => _MyOwnClassState();
}
您可以像这样在 State
类中访问它们,
class _MyOwnClassState extends State<MyOwnClass> {
Widget build(BuildContext context) {
return Text('$widget.numberThatDoesntChange');
}
}
除此之外,您的 StatefulWidget
还有更多内部实例成员,您可以使用 State
变量在 widget
类内部访问这些成员。
widget
指的是在屏幕上呈现的实际视图。它扩展了 Flutter 框架的 StatefulWidget
类并覆盖了 createState()
方法。 createState()
方法用于创建状态类的实例。我们将调查createState()
。
state class
用于维护小部件的状态,以便它可以再次重建。它扩展了 Flutter 框架的 State 类并覆盖了 build method
。
每当调用 build() method
方法时,框架都会一次又一次地调用 setState()
。 setState()
方法通知框架此对象的内部状态已更改,应重新构建。假设我们更改了 StatefulWidget
中文本的值,那么我们需要调用 setState()
。
编辑 正如 Nisanth 在他的评论中指出的那样 - 我完全错过了你的问题;请忽略以下....
让我试试我的答案,我认为其他人没有理解你的意思。
在您的示例中,Column(children: x) 需要一个小部件列表。
您有两种选择 - 或者直接提供此列表:
class _MyOwnClassState extends State<MyOwnClass> {
@override
Widget build(BuildContext context) {
return ListTile(
title: Container(
child: Column(children: <Widget>[SomeWidget()]),),);
}
}
或者,如果您有更复杂的代码来生成小部件 - 基于输入参数,或者您多次生成相同的小部件并且您想避免代码重复 - 您可以创建单独的函数来完成这项工作。>
类似于:
class _MyOwnClassState extends State<MyOwnClass> {
List<Widget> makeWidgetChildren(int param) {
/*
some very complex logic here
/*
if (param>3 && param<4) {
return List<Widget>.generate(4,(index)=>SomeWidget1(index));
} else {
return <Widget>[Center()];
}
}
@override
Widget build(BuildContext context) {
return ListTile(
title: Container(
child: Column(children: makeWidgetChildren(**widget.jsonObject)**),);
}
}
所以基本上,只是为了让代码更好看;并避免在构建函数中一遍又一遍地重复代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。