弹出多个屏幕时如何返回数据?

时间:2019-03-28 10:41:41

标签: flutter flutter-navigation

我知道我可以通过使用将数据返回到上一个屏幕

Navigator.pop(context, 'Value');

但是对于我来说,我需要使用来弹出多个屏幕

Navigator.popUntil(context, ModalRoute.withName('/login'));

我想知道在这种情况下如何将数据传递回相应的小部件?

谢谢。

2 个答案:

答案 0 :(得分:1)

flutter API不具有该功能,在本https://github.com/flutter/flutter/issues/30112讨论中,该功能尚未发布。建议使用Page API来解决。

但是,我认为,将提供程序包https://pub.dev/packages/provider用作应用程序状态管理的一部分,以保留所需的数据并将其提供给任何感兴趣的屏幕,这是更清洁的方法。请按照以下步骤来实现。

  1. 将提供程序添加到pubspec.yaml。检查上面的链接以查看详细说明。

  2. 创建一个扩展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();
    } 
}

  1. 用提供程序包装最上面的窗口小部件(或要传递数据的屏幕的父窗口),并实例化它。我在这里使用main。
void main(){
  runApp(
     ChangeNotifierProvider(create: (context) => MyDataProvider()),
   child: MyApp(),
  )
}

  1. 假设您有五个屏幕:Screen1,Screen2,...,Screen5,并且您要导航到screen5,执行一些操作并返回一些数据,返回screen1。在第一个屏幕上,为myData定义一个局部变量,并创建myDataProvider的实例。按下按钮开始导航时,将推送导航包装在一个异步调用中。
//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;
}
  1. 假设您在Screen5中检索了数据并将其添加了100。您的目标是返回到Screen1并使用新数据,即178。在这里,您将再次在Screen5中实例化提供程序,并将值178分配给myData。
//Screen5

MyDataProvider myProvider = Provider.of<MyDataProvider>(context);

myProvider.myData += 100;

//Use navigation.popUntil
Navigation.popUntil(context, ModalRoute.withName('/Screen1'));

答案 1 :(得分:0)

您可以通过几种方式发送数据

  1. 作为参数
  2. 使用Shared_Preferences
  3. 使用静态变量

仅适用于当前会话 如果您只需要当前会​​话的数据,则可以使用静态变量

第1步:创建一个类,并在其中包含静态变量。

    class Globaldata{
     static String value;
    }

第2步:通过

初始化变量
    Globaldata.value="some_value";

第3步:使用变量

    String assigned_value = Globaldata.value;