由于我无法真正复制该问题,因此我构建了一个实现刷新的工作结构。
首先是主要的小部件,在我的例子MyHomePage
中。此小部件将Scaffold
andStack
与FirstWidget
and实现SecondWidget
为子项。
class MyHomePage extends StatefulWidget {
const MyHomePage({
Key? key,
}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: const <Widget>[
FirstWidget(),
SecondWidget(),
],
),
);
}
}
FirstWidget
是一个状态为 a 的statefull
小部件counter
。它refresher
使用特定的controller
. 一旦触发了刷新,它就会调用set state
并更新counter
他的状态。那应该只会再次触发他的构建,而不是其他任何构建。我实现了 aText
来显示counter
每次刷新时增加的值,并实现了 aPrint
来公开构建。
class FirstWidget extends StatefulWidget {
const FirstWidget({
Key? key,
}) : super(key: key);
@override
State<FirstWidget> createState() => _FirstWidgetState();
}
class _FirstWidgetState extends State<FirstWidget> {
late int _counter;
late RefreshController _refreshController;
@override
void initState() {
_counter = 1;
_refreshController = RefreshController(initialRefresh: false);
super.initState();
}
@override
Widget build(BuildContext context) {
print('First widget built');
return SafeArea(
child: Column(
children: [
Container(
margin: const EdgeInsets.all(0),
width: double.infinity,
height: 500,
color: Colors.red,
child: SmartRefresher(
controller: _refreshController,
onRefresh: () async {
setState(() {
_counter++;
});
await Future.delayed(const Duration(milliseconds: 1000));
_refreshController.refreshCompleted();
},
),
),
Text("Counter: $_counter"),
],
),
);
}
}
最后我们得到SecondWidget
了另一个带有print
语句的简单小部件。在构建的情况下,它会在控制台上写入。
刷新时FirstWidget
,第二个不会构建,因为他的状态没有改变。
class SecondWidget extends StatefulWidget {
const SecondWidget({
Key? key,
}) : super(key: key);
@override
State<SecondWidget> createState() => _SecondWidgetState();
}
class _SecondWidgetState extends State<SecondWidget> {
@override
Widget build(BuildContext context) {
print('Second widget built');
return const Center(child: Text('Second here!'));
}
}
您的问题的可能原因。
可能是在刷新时,您实际上正在更新父小部件的状态,在级联时会导致重新构建您的第二个小部件。如果状态处理正确,并且您的第二个小部件不依赖于您的第一个小部件状态,则刷新不应重建第二个。