我知道我可以通过使用将数据返回到上一个屏幕
Navigator.pop(context, 'Value');
但在我的情况下,我需要使用弹出多个屏幕
Navigator.popUntil(context, ModalRoute.withName('/login'));
我想知道在这种情况下如何将数据传递回相应的小部件?
提前致谢。
我知道我可以通过使用将数据返回到上一个屏幕
Navigator.pop(context, 'Value');
但在我的情况下,我需要使用弹出多个屏幕
Navigator.popUntil(context, ModalRoute.withName('/login'));
我想知道在这种情况下如何将数据传递回相应的小部件?
提前致谢。
Flutter API 没有这个特性,从这个https://github.com/flutter/flutter/issues/30112的讨论中,这个特性还没有放在桌面上。尽管使用了 Page API,但还是建议了一个解决方法。
但是,在我看来,使用提供程序包https://pub.dev/packages/provider作为应用程序状态管理的一部分来保留您想要的数据并使其可用于任何感兴趣的屏幕会更干净。请按照以下步骤来实现。
将提供程序添加到您的 pubspec.yaml。检查上面的链接以查看详细说明。
创建一个扩展 ChangeNotifier 类的通知程序类,如下所示。ChangeNotifier 类是 Flutter API 的一部分。
class MyDataProvider extends ChangeNotifier {
//define your private data field(s). I'm using int here.
int _mydata;
//define a getter
int get myData => _myData;
// define a setter
set myData(newData){
_myData = newData;
notifyListeners();
}
}
void main(){
runApp(
ChangeNotifierProvider(create: (context) => MyDataProvider()),
child: MyApp(),
)
}
//Screen1
int currentLocalData = 78;
MyDataProvider myProvider = Provider.of<MyDataProvider>(context);
onPressed: () async {
//Assign localData to myData in the provider
myProvider.myData = currentLocalData; //calls the setter define in the provider.
await Navigator.push(context, MaterialPageRoute(
builder: (context) => Screen5()
));
//Retrieve myData from the provider and assign it to currentLocalData.
//This executes after navigating back from Screen5
currentLocalData = myProvider.myData;
}
//Screen5
MyDataProvider myProvider = Provider.of<MyDataProvider>(context);
myProvider.myData += 100;
//Use navigation.popUntil
Navigation.popUntil(context, ModalRoute.withName('/Screen1'));
您可以通过几种方式发送数据
仅适用于当前会话,如果您只需要当前会话的数据,您可以使用静态变量
第 1 步:创建一个类并在其中包含静态变量。
class Globaldata{
static String value;
}
第 2 步:初始化变量
Globaldata.value="some_value";
第三步:变量的使用
String assigned_value = Globaldata.value;
假设您有Screen A,Screen B, Screen C。如果你想弹出到屏幕 A 并传递一些数据。这是你必须做的。
1. 从屏幕 A 导航到屏幕 B
Navigator.pushNamed(context, '/screenb')
.then((value) {
//you will get return value here
});
2. 弹出到屏幕 A。
//add thi code in Screen C
var nav = Navigator.of(context);
nav.pop('refresh');
nav.pop('refresh');