将数据从类传递到类 - Flutter

时间:2018-05-21 14:36:43

标签: flutter

我有一个List Builder,它根据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();
}  

这样它就会返回正确的String。我完全失去了如何做到这一点,我无法找到另一个回答这个问题的问题。谢谢你的想法。

3 个答案:

答案 0 :(得分:1)

您可以使用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类)

答案 1 :(得分:0)

Just make initialStateLink variable Global and send it as an argument to the another class like below,

a) Specify route as follows

'/widget' : (Buildcontext context) => new Anotherscreen(initialStateLink)

b) Navigate to the Anotherscreen()

c) Then the Anotherscreen () will be like this,

class Anotherscreen () extends StatelessWidget {
var initialStateLink;

Anotherscreen (this.initialStateLink);

......
}

答案 2 :(得分:0)

我最终找到了一个解决问题的不同解决方案(通过避开实际问题)。

enter image description here允许您在发送参数时构建新的小部件。所以这样做了所以我没有必要在课外发送任何数据,这是我的代码:

return new Card(
    child: new GestureDetector(
    onTap: () {
        Navigator.push(context,
            new MaterialPageRoute(
            builder: (BuildContext context) => new WebviewScaffold(
        url: ds['initialStateLink'],
        appBar: new AppBar(
            title: new Text("Your Device: "+'${ds['name']}'),
        ),
        withZoom: true,
        withLocalStorage: true,)
));},