3

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

Navigator.pop(context, 'Value');

但在我的情况下,我需要使用弹出多个屏幕

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

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

提前致谢。

4

3 回答 3

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. 用提供者包装你最上面的小部件(或你想要传递数据的屏幕的父级)并实例化它。我在这里使用主要。
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'));

于 2020-05-30T15:34:24.027 回答
1

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

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

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

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

    class Globaldata{
     static String value;
    }

第 2 步:初始化变量

    Globaldata.value="some_value";

第三步:变量的使用

    String assigned_value = Globaldata.value;
于 2019-03-28T11:35:34.460 回答
0

假设您有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');
于 2021-09-22T18:44:33.240 回答