首页 > 解决方案 > 将数据从一个类传递到另一个类 - Flutter

问题描述

我有一个列表生成器,它根据 Firestore 中列出的文档创建一个列表。我正在尝试获取从 Firestore 快照生成的值,并将其从类中传递给一个变量,每次用户从 List Builder 中单击不同的条目时,该变量都会更新。这是进行 Firestore 交互并返回 ListBuilder 的类:

class DeviceBuilderListState extends State<DeviceBuilderList> {
  final flutterWebviewPlugin = new FlutterWebviewPlugin();

  @override
  void initState() {
    super.initState();

    // Listen for our auth event (on reload or start)
    // Go to our device page once logged in
    _auth.onAuthStateChanged
        .where((user) {
      new MaterialPageRoute(builder: (context) => new DeviceScreen());
    });

    // Give the navigation animations, etc, some time to finish
    new Future.delayed(new Duration(seconds: 1))
        .then((_) => signInWithGoogle());
  }

  void setLoggedIn() {
    _auth.onAuthStateChanged
        .where((user) {
      Navigator.of(context).pushNamed('/');
    });
    }

  @override
  Widget build(BuildContext context) {
    return new FutureBuilder<FirebaseUser>(
        future: FirebaseAuth.instance.currentUser(),
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
              if (snapshot.data != null)
                return new StreamBuilder(
                  stream: Firestore.instance
                      .collection('users')
                      .document(snapshot.data.uid)
                      .collection('devices')
                      .snapshots,
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      return new Container();
                    return new Container(
                      margin: const EdgeInsets.symmetric(vertical: 10.0),
                        child: new ListView.builder(
                            itemCount: snapshot.data.documents.length,
                            padding: const EdgeInsets.all(10.0),
                            itemBuilder: (context, index) {
                              DocumentSnapshot ds =
                              snapshot.data.documents[index];
                              return new Card(
                                  child: new GestureDetector(
                                  onTap: () {

                                      var initialStateLink = "${ds['name']}";

                                Navigator.of(context).pushNamed("/widget");
                              },
                              child: new Text(
                                " ${ds['name']}",
                                style: new TextStyle(fontSize: 48.0),
                              ),
                              ));
                            }),

                    );
                  },
                );
              else return new Container();
          }

    );}
}  

然后我想将 var initialStateLink 发送到同一个 dart 文件中的不同函数:

Future<String> initialStateUrl() async {
  final FirebaseUser currentUser = await _auth.currentUser();

  Firestore.instance.collection('users')
      .document(currentUser.uid).collection('devices').document(initialStateLink).get()
      .then((docSnap) {
    var initialStateLink = ['initialStateLink'];
      return initialStateLink.toString();
      });
  return initialStateUrl().toString();
}  

以便它返回正确的字符串。我对如何做到这一点完全不知所措,我无法找到另一个回答这个问题的问题。感谢您的想法。

标签: flutter

解决方案


您可以使用Navigator.push(Route route)而不是Navigator.pushNamed(String routeName)

而且我不鼓励您将导航代码深入到小部件树中,很难维护您的应用程序流逻辑,因为您最终会在许多类中获得许多导航代码。我的解决方案是将导航代码放在一个地方(一类)。让我们称之为它AppRoute,它看起来像:

class AppRoute {

  static Function(BuildContext, String) onInitialStateLinkSelected =
      (context, item) =>
      Navigator.of(context).push(
          new MaterialPageRoute(builder: (context) {
              return new NewScreen(initialStateLink: initialStateLink);
            }
          ));

}

并替换您的代码onTap

onTap: () {
  var initialStateLink = "${ds['name']}";
  AppRoute.onInitialStateLinkSelected(context, initialStateLink);
}

现在,您不仅可以将数据从类传递到另一个类,还可以轻松控制您的应用程序流程(只需查看AppRoute类)


推荐阅读