Flutter 应用程序导航问题
Flutter application Navigation Issue
我的应用程序中有 2 个屏幕。在第一个屏幕中,我列出了我的 sqflite 数据库中的所有数据。在第二个屏幕中,我提供了删除该记录的功能。但是当我从堆栈中弹出那个屏幕时。它应该被刷新。我怎样才能做到这一点。
这是我的第一个屏幕 return 代码。
return FutureBuilder<List>(
future: DatabaseHelper.instance.queryAll(),
initialData: List(),
builder: (context, snapshot) {
return snapshot.hasData
? new ListView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: snapshot.data.length,
itemBuilder: (context, i) {
print("value : " + snapshot.data.toString());
return new Card(
child: Column(mainAxisSize: MainAxisSize.min, children: <
Widget>[
ListTile(
leading:
Image.file(File(snapshot.data[i]["thumbnail_url"])),
title: Text(
snapshot.data[i]["title"],
style: _biggerFont,
),
subtitle: Text(snapshot.data[i]["month"] +
", " +
snapshot.data[i]["year"]),
onTap: () {
},
),
ButtonBar(
children: <Widget>[
Visibility(
visible: _isUrduAvail,
child: FlatButton(
child: const Text('اردو'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["urdu_url"],
"Urdu")));
},
),
),
Visibility(
visible: _isEnglishAvail,
child: FlatButton(
child: const Text('English'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["english_url"],
"English")));
},
),
),
Visibility(
visible: _isHindiAvail,
child: FlatButton(
child: const Text('हिन्दी'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["hindi_url"],
"Hindi")));
},
),
),
],
)
]));
},
)
: Center(
child: CircularProgressIndicator(),
);
},
);
在此屏幕中,我正在构建列表并填充 FutureBuilder。
在第二个屏幕上我有按钮点击该按钮记录将被删除但是调用它可以刷新的路由是什么?
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (BuildContext context) => LibraryScreen(),
),
(route) => false,
);
我试过这段代码,但它清除了我所有的 activity 堆栈。
当您调用第二个屏幕时,请尝试使用 'pushReplacement' 而不是 'push'
你可以尝试使用'Pushreplacement'因为它会处理之前的路由
如果你 pushAndRemoveUntil 你不能返回到同一页面。您需要再次推送它,在这种情况下 FutureBuilder 将重建并且您将看到正确的数据。
或者更好的解决方案是将数据作为 Stream 而不是 Future,并使用 StreamBuilder 而不是 FutureBuilder。
我的应用程序中有 2 个屏幕。在第一个屏幕中,我列出了我的 sqflite 数据库中的所有数据。在第二个屏幕中,我提供了删除该记录的功能。但是当我从堆栈中弹出那个屏幕时。它应该被刷新。我怎样才能做到这一点。
这是我的第一个屏幕 return 代码。
return FutureBuilder<List>(
future: DatabaseHelper.instance.queryAll(),
initialData: List(),
builder: (context, snapshot) {
return snapshot.hasData
? new ListView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: snapshot.data.length,
itemBuilder: (context, i) {
print("value : " + snapshot.data.toString());
return new Card(
child: Column(mainAxisSize: MainAxisSize.min, children: <
Widget>[
ListTile(
leading:
Image.file(File(snapshot.data[i]["thumbnail_url"])),
title: Text(
snapshot.data[i]["title"],
style: _biggerFont,
),
subtitle: Text(snapshot.data[i]["month"] +
", " +
snapshot.data[i]["year"]),
onTap: () {
},
),
ButtonBar(
children: <Widget>[
Visibility(
visible: _isUrduAvail,
child: FlatButton(
child: const Text('اردو'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["urdu_url"],
"Urdu")));
},
),
),
Visibility(
visible: _isEnglishAvail,
child: FlatButton(
child: const Text('English'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["english_url"],
"English")));
},
),
),
Visibility(
visible: _isHindiAvail,
child: FlatButton(
child: const Text('हिन्दी'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => OfflinePdfViewer(
snapshot.data[i]["id"].toString(),
snapshot.data[i]["title"],
snapshot.data[i]["hindi_url"],
"Hindi")));
},
),
),
],
)
]));
},
)
: Center(
child: CircularProgressIndicator(),
);
},
);
在此屏幕中,我正在构建列表并填充 FutureBuilder。
在第二个屏幕上我有按钮点击该按钮记录将被删除但是调用它可以刷新的路由是什么?
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (BuildContext context) => LibraryScreen(),
),
(route) => false,
);
我试过这段代码,但它清除了我所有的 activity 堆栈。
当您调用第二个屏幕时,请尝试使用 'pushReplacement' 而不是 'push'
你可以尝试使用'Pushreplacement'因为它会处理之前的路由
如果你 pushAndRemoveUntil 你不能返回到同一页面。您需要再次推送它,在这种情况下 FutureBuilder 将重建并且您将看到正确的数据。
或者更好的解决方案是将数据作为 Stream 而不是 Future,并使用 StreamBuilder 而不是 FutureBuilder。