从 child 弹出时根小部件未重建
Root widget not rebuilding when popping from child
我一直在开发一个 flutter 应用程序,在该应用程序中,用户从一个有状态的小部件开始,该小部件具有来自 SQLite 数据库的项目的 ListView。用户可以点击列表中的项目,导航到可以修改和保存项目的页面。
使用Navigator.pop(context)
时,应用程序returns到ListView但不重建。在我强制重建(热重载)之前所做的更改不会显示
这是 flutter 1.17 中的一个新问题。
根视图
class ItemsView extends StatefulWidget {
@override
_ItemsView State createState() => _ItemsViewState();
}
class _ItemsViewState extends State<ItemsView> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Story>>(
future: DBProvider.db.getAllItems(),
builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data[0])
}
}
)
}
}
第二个视图
class ModifyView extends StatefulWidget {
@override
_ModifyView State createState() => _ItemsViewState();
}
class _ItemsViewState extends State<ItemsView> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Story>>(
future: DBProvider.db.getAllItems(),
builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data[0])
}
}
)
}
}
如何强制重新加载小部件?
您可以使用 Navigator's
方法 then
,您可以在该方法上重新加载页面或执行任何其他操作。在下面的示例中,我使用屏幕 A 到屏幕 B 导航,当用户从 B[=27 导航时=] 到 A ,我们将刷新视图或执行以下任何其他操作。
From Screen A -> B
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: B), ///// HERE "B" IS THE CLASS NAME
builder: (context) =>
B(),
),
).then((value) {
//// THIS METHOD IS ENVOKE WHEN SCREEN COME FROM B->A, YOU CAN PERFROM CAN TASK HERE
});
在 B 屏幕中,我们需要创建如下所示的构造函数
class B extends StatefulWidget {
B () ;
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _B();
}
}
Navigation from B to A
Navigator.pop(context, 1); //// HERE WE ARE PUSHING THE ANY VALUE "1" FOR THE RETURN IN then OF CLASS "A"
我一直在开发一个 flutter 应用程序,在该应用程序中,用户从一个有状态的小部件开始,该小部件具有来自 SQLite 数据库的项目的 ListView。用户可以点击列表中的项目,导航到可以修改和保存项目的页面。
使用Navigator.pop(context)
时,应用程序returns到ListView但不重建。在我强制重建(热重载)之前所做的更改不会显示
这是 flutter 1.17 中的一个新问题。
根视图
class ItemsView extends StatefulWidget {
@override
_ItemsView State createState() => _ItemsViewState();
}
class _ItemsViewState extends State<ItemsView> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Story>>(
future: DBProvider.db.getAllItems(),
builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data[0])
}
}
)
}
}
第二个视图
class ModifyView extends StatefulWidget {
@override
_ModifyView State createState() => _ItemsViewState();
}
class _ItemsViewState extends State<ItemsView> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Story>>(
future: DBProvider.db.getAllItems(),
builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data[0])
}
}
)
}
}
如何强制重新加载小部件?
您可以使用 Navigator's
方法 then
,您可以在该方法上重新加载页面或执行任何其他操作。在下面的示例中,我使用屏幕 A 到屏幕 B 导航,当用户从 B[=27 导航时=] 到 A ,我们将刷新视图或执行以下任何其他操作。
From Screen A -> B
Navigator.push(
context,
MaterialPageRoute(
settings: RouteSettings(
name: B), ///// HERE "B" IS THE CLASS NAME
builder: (context) =>
B(),
),
).then((value) {
//// THIS METHOD IS ENVOKE WHEN SCREEN COME FROM B->A, YOU CAN PERFROM CAN TASK HERE
});
在 B 屏幕中,我们需要创建如下所示的构造函数
class B extends StatefulWidget {
B () ;
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _B();
}
}
Navigation from B to A
Navigator.pop(context, 1); //// HERE WE ARE PUSHING THE ANY VALUE "1" FOR THE RETURN IN then OF CLASS "A"