假设我有一个主屏幕(有状态小部件),其中有一个变量count
作为状态。在此主屏幕中,有一个按钮和另一个有状态小部件(我们称之为MyListWidget
. MyListWidget
初始化它自己的小部件initState
取决于的值count
多变的。显然如果你改变的值count
并打电话SetState
,什么都不会发生MyListWidget
因为它创造了价值initState
。我怎样才能强制重建MyListWidget
?
我知道在这个例子中我们可以移动我们在initState
in the build
方法。但在我真正的问题中,我无法移动我在其中所做的事情initState
in the build
method.
这是完整的代码示例:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int count = 5;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: [
Expanded(
child: MaterialButton(
child: Text('Click me'),
color: Colors.red,
onPressed: () {
setState(() {
count++;
});
},
),
),
MyListWidget(count),
],
));
}
}
class MyListWidget extends StatefulWidget {
final int count;
const MyListWidget(this.count, {Key? key}) : super(key: key);
@override
_MyListWidgetState createState() => _MyListWidgetState();
}
class _MyListWidgetState extends State<MyListWidget> {
late List<int> displayList;
@override
void initState() {
super.initState();
displayList = List.generate(widget.count, (int index) => index);
}
@override
Widget build(BuildContext context) {
return Expanded(
child: ListView.builder(
itemBuilder: (BuildContext context, int index) => ListTile(
title: Text(displayList[index].toString()),
),
itemCount: displayList.length,
),
);
}
}
我认为接受的答案不准确,Flutter将保留以下状态MyListWidget
因为它与以前的类型相同,并且在小部件树中的位置相同。
相反,强制重建小部件更改其密钥 https://jelenaaa.medium.com/how-to-force-widget-to-redraw-in-flutter-2eec703bc024:
class _MyHomePageState extends State<MyHomePage> {
int count = 5;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: [
Expanded(
child: MaterialButton(
child: Text('Click me'),
color: Colors.red,
onPressed: () {
setState(() {
count++;
});
},
),
),
MyListWidget(count, key: ValueKey(count)),
],
),
);
}
}
Using a ValueKey
在这个例子中意味着只有在以下情况下才会重新创建状态count
实际上是不同的。
或者,您可以监听小部件的变化State.didUpdateWidget https://api.flutter.dev/flutter/widgets/State/didUpdateWidget.html,您可以在其中比较当前this.widget
随着传入的oldWidget
并在必要时更新状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)