import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter_auths/pages/searchservice.dart';
import 'package:flutter_auths/pages/tasks.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var queryResultSet = [];
  var tempSearchStore = [];

  initiateSearch(value) {
    if (value.length == 0) {
      setState(() {
        queryResultSet = [];
        tempSearchStore = [];
      });
    }

    var capitalizedValue =
        value.substring(0, 1).toUpperCase() + value.substring(1);

    if (queryResultSet.length == 0 && value.length == 1) {
      SearchService().searchByName(value).then((QuerySnapshot docs) {
        for (int i = 0; i < docs.documents.length; ++i) {
          queryResultSet.add(docs.documents[i].data);
        }
      });
    } else {
      tempSearchStore = [];
      queryResultSet.forEach((element) {
        if (element['Username'].startsWith(capitalizedValue)) {
          setState(() {
            tempSearchStore.add(element);
          });
        }
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: Text('Firestore search'),
        ),
        body: ListView(children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: TextField(
              onChanged: (val) {
                initiateSearch(val);
              },
              decoration: InputDecoration(
                  prefixIcon: IconButton(
                    color: Colors.black,
                    icon: Icon(Icons.arrow_back),
                    iconSize: 20.0,
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  ),
                  contentPadding: EdgeInsets.only(left: 25.0),
                  hintText: 'Search by name',
                  border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(4.0))),
            ),
          ),
          SizedBox(height: 10.0),
          GridView.count(
              padding: EdgeInsets.only(left: 10.0, right: 10.0),
              crossAxisCount: 2,
              crossAxisSpacing: 4.0,
              mainAxisSpacing: 4.0,
              primary: false,
              shrinkWrap: true,
              children: tempSearchStore.map((element) {
                return buildResultCard(element);
              }).toList())
        ]));
  }
}

Widget buildResultCard(data) {
  return Card(
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      elevation: 2.0,
      child: Container(
          child: Column(
              children: <Widget> [ Text(data['Username'],
                textAlign: TextAlign.center,
                style: TextStyle(
                  color: Colors.black,
                  fontSize: 20.0,
                ),
              ),
                RaisedButton(
                  onPressed: () {
                    Navigator.push(
                      data,
                      MaterialPageRoute(builder: (data) => ProfilePage()),
                    );
                  },
                  child: const Text('asd', style: TextStyle(fontSize: 12)),
                ),
              ]
          )
      )
  );
}

Hier suche ich nach einem Benutzer aus der Datenbank, dann werden mir die Ergebnisse in Karten angezeigt. Ich habe eine Schaltfläche hinzugefügt und durch Klicken darauf möchte ich die Seite zu einer anderen Seite navigieren, aber der folgende Fehler tritt auf. Dies ist der Fehler und die App

Daher möchte ich auf die Schaltfläche eines bestimmten Benutzers klicken und die Seite zum Profil dieses Benutzers umleiten. Wie kann ich das machen?

0
blueshoot 18 Aug. 2020 im 18:09

2 Antworten

Beste Antwort

Sie erhalten diesen Fehler, weil Sie anstelle von buildContext Daten übergeben. Ihr Fehler wird also behoben, wenn Sie Ihren Code daraus ändern

Navigator.push(
   data,
   MaterialPageRoute(builder: (data) => ProfilePage()),
);

Zu

Navigator.push(
   context,
   MaterialPageRoute(builder: (context) => ProfilePage(username: data['Username']))
);

So sollten Sie die Daten an die Profilseite übergeben.

Ebenfalls

Widget buildResultCard(data)

Geändert werden zu

Widget buildResultCard(context, data)

Und

buildResultCard(element);

Zu

buildResultCard(context, element);
0
spycbanda 19 Aug. 2020 im 03:41

Zuerst müssen Sie zu dieser Seite mit Daten wie navigieren

Navigator.push(
   context,
   MaterialPageRoute(builder: (context) => ProfilePage(profileData: data))
);

Dann müssen Sie diese Daten empfangen

class ProfilePage extends StatefulWidget {
  var profileData;

  ProfilePage({this.profileData});

  @override
  _ProfilePageState createState() => _ProfilePageState();
}

class _ProfilePageState extends State<ProfilePage> {



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(widget.profileData['username']),
      ),
    );
  }
}

Sie können Daten auf andere Weise weitergeben und empfangen

Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => ProfilePage(),settings: RouteSettings(arguments: data))
);

Dann

    class ProfilePage extends StatefulWidget {

  @override
  _ProfilePageState createState() => _ProfilePageState();
}

class _ProfilePageState extends State<ProfilePage> {
  var profileData;
  
  @override
  Widget build(BuildContext context) {
    profileData=ModalRoute.of(context).settings.arguments;
    return Scaffold(
      body: Center(
        child: Text(profileData['username']),
      ),
    );
  }
}
0
MD.FAISAL KABIR 18 Aug. 2020 im 16:52