Передача данных на следующий экран при использовании StreamBuilder во флаттере - PullRequest
1 голос
/ 13 апреля 2020

Я могу получить данные из хранилища в виджете карты, но не могу go детализировать - я имею в виду передать снимок с первого экрана на второй (от страницы BodySectionStream до DetailPage). Я много пробовал, но не получилось. Пожалуйста, просмотрите мой код и помогите мне решить проблему. Заранее спасибо

class BodySectionStream extends StatefulWidget {

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

class _BodySectionStreamState extends State<BodySectionStream> {

  final firestore = Firestore.instance;



  navigateToDetail( AsyncSnapshot post) {
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => DetailPage(
                  news: post,
                )));
  }


  @override
  Widget build(BuildContext context) {


    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Container(
        child: Column(
          children: <Widget>[
            Align(
              alignment: Alignment.centerLeft,
              child: Container(child:
              Text('Prefernces', textAlign: TextAlign.left, style: TextStyle(
                fontWeight: FontWeight.w500, fontSize: 22.0, color: Colors.black),)),
            ),

            const SizedBox(height:10.0),

            StreamBuilder <QuerySnapshot>(
                stream: firestore.collection('news').snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData) {
                    return Center (child: CircularProgressIndicator());
                  } 
                  else {
                    final posts = snapshot.data.documents;
                    List<Container> postWidgets = [];
                    for (var post in posts ){
                      final postText = post.data['title'];
                      final postList = Container(
                      child:  GestureDetector(
                        onTap: () => navigateToDetail( post.data[index]),
                          child: Card(

                          child: Column(children: <Widget>[
                            Image.network(post.data['images'],),
                            Text(postText),
                          ],)
                        ),
                      )
                      );


                      postWidgets.add(postList);

                    }
                    return Expanded(
                      child: ListView(
                        children: postWidgets,
                        ));
                  }
                }),

          ],
        ),
      ),
    );
  }
}

DetailPage - куда я хочу передать данные

class DetailPage extends StatefulWidget {
  final AsyncSnapshot news;

  DetailPage({this.news});

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

class _DetailPageState extends State<DetailPage> {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Column(
         children: <Widget>[
           Text(widget.news.data['title'])
         ],
        ),
      ),
    );
  }
}

1 Ответ

2 голосов
/ 13 апреля 2020
final posts = snapshot.data.documents;

получатель documents возвращает List типа DocumentSnapshot, вы передаете DetailPage поле документа здесь:

onTap: () => navigateToDetail( post.data[index]),

Но вы хотите передать DocumentSnapshot, чтобы получить доступ к полю title в DetailPage, поэтому просто передайте post:

onTap: () => navigateToDetail(post),

и измените тип данных news с AsyncSnapshot на DocumentSnapshot в вашем DetailPage класс.

...