Home > Blockchain >  How to retrieve the selected item in the list to display its details in detail page Flutter
How to retrieve the selected item in the list to display its details in detail page Flutter

Time:02-05

I have a list in a database and each item in the list has specific characteristics I want when I choose an item from the list; the detail_list page only displays the characteristics of this element by retrieving it from the firebase database.

  • the home page shows me all the customer cards
  • Detail page displays Detail card -detail card retrieve widgets from Card_Front -Card_Front shows me the details of the element I have chosen

=> how to retrieve the item selected in the list to display its details

HomePage

import 'dart:math';  
import 'package:clickable_list_wheel_view/clickable_list_wheel_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:../rotate/detail_page.dart';
import 'package:../rotate/page_notifier.dart';
import 'package:../rotate/size_config.dart';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';


class PageHome extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<PageHome> {
  bool animateCardNumber = true;
  final _scrollController = FixedExtentScrollController();
  double _itemHeight = 60;
  int _itemCount = 100;    
  @override
  void initState() {
    SystemChrome.setEnabledSystemUIOverlays([]);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    FirebaseAuth auth = FirebaseAuth.instance;
    User user = auth.currentUser;
    CollectionReference _productss = FirebaseFirestore.instance
        .collection('Card')
        .doc(user.uid)
        .collection(user.uid);
    SizeConfig().init(context);
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        backgroundColor: Colors.black,
        leading: Icon(
          Icons.arrow_back,
          color: Colors.white,
          size: SizeConfig.defaultHeight * 4,
        ),
      ),
      body: SafeArea(
          child: StreamBuilder(
        stream: _productss.snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> streamSnapshot) {
          if (!streamSnapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          return ClickableListWheelScrollView(
            scrollController: _scrollController,
            itemHeight: 250,
            itemCount: _itemCount,
            onItemTapCallback: (indexx) {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => DetailPage()));
            },
            child: ListWheelScrollView.useDelegate(
              controller: _scrollController,
              itemExtent: 250,
              diameterRatio: 3,
              offAxisFraction: -0.5,
              physics: FixedExtentScrollPhysics(),
              overAndUnderCenterOpacity: 0.5,
              perspective: 0.002,
              childDelegate: ListWheelChildBuilderDelegate(
                childCount: streamSnapshot.data.docs.length,
                builder: (context, index) {
                  final DocumentSnapshot documentSnapshot =
                      streamSnapshot.data.docs[0];
                  return Container(
                    padding:
                        EdgeInsets.only(bottom: SizeConfig.defaultHeight * 5),
                    child: AspectRatio(
                      aspectRatio: 5 / 3,
                      child: Container(
                        decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(20),
                            gradient: const LinearGradient(
                                colors: [
                                  Color(0xFF0000FF),
                                  Color(0XFF377CFF),
                                ],
                                begin: Alignment.bottomLeft,
                                end: Alignment.topRight,
                                stops: [0, 0.8],
                                tileMode: TileMode.clamp)),
                        child: Padding(
                          padding: EdgeInsets.symmetric(
                              horizontal: SizeConfig.defaultWidth * 2,
                              vertical: SizeConfig.defaultHeight * 2),
                          child: Column(
                            children: [
                              Expanded(
                                flex: 2,
                                child: Row(
                                  mainAxisAlignment:
                                      MainAxisAlignment.spaceBetween,
                                  children: [
                                    Text(
                                      "Card",
                                      style: Theme.of(context)
                                          .textTheme
                                          .headline6
                                          .copyWith(
                                              fontWeight: FontWeight.bold,
                                              color: Colors.white),
                                    ),
                                    Transform.rotate(
                                      angle: pi / 2,
                                      child: Icon(
                                        Icons.wifi,
                                        size: SizeConfig.defaultHeight * 4,
                                        color: Colors.white,
                                      ),
                                    )
                                  ],
                                ),
                              ),
                              Spacer(
                                flex: 1,
                              ),
                              Expanded(
                                flex: 2,
                                child: Row(
                                  children: [
                                    Transform.translate(
                                      offset:
                                          Offset(-SizeConfig.defaultWidth, 0),
                                     
                                    ),
                                   
                                
                                  ],
                                ),
                              ),
                              Spacer(
                                flex: 1,
                              ),
                              Expanded(
                                flex: 2,
                                child: Row(
                                  children: [
                                    Column(
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: [
                                       
                                        Text(
                                          documentSnapshot['Name'],
                                          style: Theme.of(context)
                                              .textTheme
                                              .bodyText1
                                              .copyWith(color: Colors.white),
                                        )
                                      ],
                                    ),
                                   

                   
                                  ],
                                ),
                              )
                            ],
                          ),
                        ),
                      ),
                    ),
                  );
                  ;
                },
              ),
            ),
          );
        },
      )
  
        ),
    );
  }
}

Detail page

import 'package:flutter/material.dart';    
import 'package:../rotate/detail_card.dart';    
import 'package:../rotate/size_config.dart';    
class DetailPage extends StatefulWidget {
  const DetailPage({Key key}) : super(key: key);

  _DetailPageState createState() => _DetailPageState();
}

class _DetailPageState extends State<DetailPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        backgroundColor: Colors.black,
        leading: IconButton(
          onPressed: () => Navigator.pop(context),
          icon: Icon(
            Icons.arrow_back,
            color: Colors.white,
            size: SizeConfig.defaultHeight * 4,
          ),
        ),
        actions: [
          Icon(
            Icons.share,
            color: Colors.white,
            size: SizeConfig.defaultHeight * 4,
          )
        ],
      ),
      body: Stack(
        alignment: Alignment.topCenter,
        children: [
  
      DetailCard(),
         
        ],
      ),
    );
  }
}

Detail_card

import 'package:flutter/material.dart';
import 'back_card.dart';
import 'front_card.dart';

class DetailCard extends StatefulWidget {
  @override
  _DetailCardState createState() => _DetailCardState();
}

class _DetailCardState extends State<DetailCard> {
  bool animateCardNumber = true;


  @override
  void initState() {
    Future.delayed(Duration(milliseconds: 1000),
        () => setState(() => animateCardNumber = false));
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Align(
        alignment: Alignment.center,
        child: Padding(
            padding: EdgeInsets.fromLTRB(
                SizeConfig.defaultWidth * 2,
                0,
                SizeConfig.defaultWidth * 2,
                0 > 0.462
                    ? SizeConfig.defaultHeight * 55
                    : SizeConfig.defaultHeight * 20),
            child: 
                frontWidget: FrontCard(
                  showCardNumber: true,
                  animateCardNumber: animateCardNumber,
                 
               
              )));
  }
}

Card_Front

import 'dart:math';    
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';    
import 'package:flutter/material.dart';  
import 'package:../rotate/detail_page.dart';    
import 'package:../rotate/size_config.dart';



class FrontCard extends StatefulWidget {
  final bool showCardNumber;
  bool animateCardNumber;

  final DetailPage detailPage;

  FrontCard({
    Key key,
    this.showCardNumber = false,
    this.animateCardNumber = true,

    this.detailPage,
  }) : super(key: key);

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

class _FrontCardState extends State<FrontCard> {

  @override
  Widget build(BuildContext context) {
    FirebaseAuth auth = FirebaseAuth.instance;
    User user = auth.currentUser;
    CollectionReference _productss = FirebaseFirestore.instance
        .collection('Card')
        .doc(user.uid)
        .collection(user.uid);
    return StreamBuilder(
        stream: _productss.snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> streamSnapshot) {
          if (!streamSnapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          final DocumentSnapshot documentSnapshot = streamSnapshot.data.docs[0];
          return AspectRatio(
            aspectRatio: 5 / 3,
            child: Container(
              decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(20),
                  gradient: const LinearGradient(
                      colors: [
                        Color(0xFF0000FF),
                        Color(0XFF377CFF),
                      ],
                      begin: Alignment.bottomLeft,
                      end: Alignment.topRight,
                      stops: [0, 0.8],
                      tileMode: TileMode.clamp)),
              child: Padding(
                padding: EdgeInsets.symmetric(
                    horizontal: SizeConfig.defaultWidth * 2,
                    vertical: SizeConfig.defaultHeight * 2),
                child: Column(
                  children: [
                    Expanded(
                      flex: 2,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                          Text(
                            "Rest",
                            style: Theme.of(context)
                                .textTheme
                                .headline6
                                .copyWith(
                                    fontWeight: FontWeight.bold,
                                    color: Colors.white),
                          ),
                          Transform.rotate(
                            angle: pi / 2,
                            child: Icon(
                              Icons.wifi,
                              size: SizeConfig.defaultHeight * 4,
                              color: Colors.white,
                            ),
                          )
                        ],
                      ),
                    ),
                    Spacer(
                      flex: 1,
                    ),
                    Expanded(
                      flex: 2,
                      child: Row(
                        children: [                                                    
                          Expanded(
                              flex: 5,
                              child: 
                                Text(
                                    animateCardNumber
                                        ? documentSnapshot['Number']
                                            .substring(0, value)
                                        : documentSnapshot['Number'],
                                    textAlign: TextAlign.center,
                                    style: Theme.of(context)
                                        .textTheme
                                        .headline6
                                        .copyWith(color: Colors.white),
                                  );
                                },
                              )
                        ],
                      ),
                    ),
                    Spacer(
                      flex: 1,
                    ),
                    Expanded(
                      flex: 2,
                      child: Row(
                        children: [
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              
                              Text(
                                documentSnapshot['Name'],
                                style: Theme.of(context)
                                    .textTheme
                                    .bodyText1
                                    .copyWith(color: Colors.white),
                              )
                            ],
                          ),
                          
                       
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          );
        });
  }
}

CodePudding user response:

You have a lot of code posted here. I will take only the part that needs my help.

onItemTapCallback: (indexx) {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => 
                      // Pass the object to the details page constructor
                       DetailPage(
                        doc: streamSnapshot.data.docs[indexx]
                      )));
            },


class DetailCard extends StatefulWidget {
   final var doc;
   DetailCard({required this.doc});
    @override
   _DetailCardState createState() => _DetailCardState();
}

class _DetailCardState extends State<DetailCard> {
   bool animateCardNumber = true;

   late var doc;


  @override
  void initState() {
    Future.delayed(Duration(milliseconds: 1000),
     () => setState(() => animateCardNumber = false));
    super.initState();
    doc = widget.doc; // Access the document that was passed through the constructor here.
   }

 @override
 Widget build(BuildContext context) {
    return Align(
    alignment: Alignment.center,
    child: Padding(
        padding: EdgeInsets.fromLTRB(
            SizeConfig.defaultWidth * 2,
            0,
            SizeConfig.defaultWidth * 2,
            0 > 0.462
                ? SizeConfig.defaultHeight * 55
                : SizeConfig.defaultHeight * 20),
        child: 
            frontWidget: FrontCard(
              showCardNumber: true,
              animateCardNumber: animateCardNumber,
          )));
   }
  }

CodePudding user response:

I was able to retrieve how many squares there are at the customer's but I could not read the data from each card and display it I replaced the results with static data=> ('aaaaaa') I want to recover the data of each card but each time an error is displayed: (An exception has occurred. NoSuchMethodError (NoSuchMethodError: The method '[]' was called on null. Receiver: null Tried calling: )) how to do ?!

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:..t/rotate/page_notifier.dart';
import 'package:../rotate/size_config.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:simple_animations/simple_animations.dart';

class PageHome extends StatefulWidget {
  final String id;
  const PageHome({
    key,
    this.id,
  }) : super(key: key);
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<PageHome> {
  String _idDoc;
  DocumentSnapshot _res;
  String _id;
  List<QueryDocumentSnapshot> _produit = new List();
  PageNotifier _pageNotifier = PageNotifier();
  @override
  void initState() {
    _id = widget.id;
    super.initState();
    _getProductFromDatabaseUsingCategory();
  }

  _getProductFromDatabaseUsingCategory() {
    FirebaseAuth auth = FirebaseAuth.instance;
    User user = auth.currentUser;
    CollectionReference cartsRef = FirebaseFirestore.instance
        .collection('Card')
        .doc(user.uid)
        .collection(user.uid);

    cartsRef.where('ID', arrayContains: _id).get().then((res) {
      setState(() {
        _produit = res.docs;
        //_res = res as DocumentSnapshot<Object>;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    SizeConfig().init(context);
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        backgroundColor: Colors.black,
        leading: Icon(
          Icons.arrow_back,
          color: Colors.white,
          size: SizeConfig.defaultHeight * 4,
        ),
      ),
      body: SafeArea(
        child: ChangeNotifierProvider(
          create: (_) => _pageNotifier,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              //HomeHeader(),
              /* Balance(
                              previousIndex: _previousIndex, currentIndex: _currentIndex), */
              _buildCardsList(),
              //_buildPageIndicator(),
            ],
          ),
        ),
      ),
    );
  }

  _buildCardsList() => Container(
        margin: EdgeInsets.fromLTRB(10, 10, 0, 10),
        height: MediaQuery.of(context).size.height - 250,
        child: Expanded(
          child: Transform(
            transform: Matrix4.identity()
              ..translate(-SizeConfig.defaultWidth * 4)
              ..rotateZ(-pi / 2),
            alignment: Alignment.center,
            child: PageView.builder(
                scrollDirection: Axis.vertical,
                itemCount: _produit.length,
                controller: _pageNotifier.pageController,
                onPageChanged: (index) => setState(() {
                      _previousIndex = _currentIndex;
                      _currentIndex = index;
                    }),
                itemBuilder: (context, index) {
                  return Consumer<PageNotifier>(
                    builder: (context, value, child) {
                      if (value.currentPage > index) {
                        double scaleFactor =
                            max(1 - (value.currentPage - index) * 0.4, 0.6);
                        double angleFactor =
                            min((value.currentPage - index) * 20, 20);
                        return Transform(
                          transform: Matrix4.identity()
                            ..setEntry(3, 2, 0.001)
                            ..scale(scaleFactor)
                            ..rotateZ(-(pi / 180) * angleFactor),
                          alignment: Alignment.center,
                          child: child,
                        );
                      }
                      return child;
                    },
                    child: GestureDetector(
                      onTap: () {
                        String id = _produit[index].id;
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => Scaffold(
                                      backgroundColor: Colors.black,
                                      appBar: AppBar(
                                        backgroundColor: Colors.black,
                                        leading: IconButton(
                                          onPressed: () =>
                                              Navigator.pop(context),
                                          icon: Icon(
                                            Icons.arrow_back,
                                            color: Colors.white,
                                            size: SizeConfig.defaultHeight * 4,
                                          ),
                                        ),
                                        actions: [
                                          Padding(
                                            padding: EdgeInsets.only(
                                                right: SizeConfig.defaultWidth *
                                                    2),
                                            child: Icon(
                                              Icons.share,
                                              color: Colors.white,
                                              size:
                                                  SizeConfig.defaultHeight * 4,
                                            ),
                                          )
                                        ],
                                      ),
                                      body: Stack(
                                        alignment: Alignment.topCenter,
                                        children: [
                                          PlayAnimation(
                                              tween:
                                                  Tween(begin: 0.2, end: 1.0),
                                              curve: Curves.easeOut,
                                              duration:
                                                  Duration(milliseconds: 200),
                                              builder: (context, child,
                                                      value) =>
                                                  Transform.scale(
                                                    scale: value,
                                                    alignment: Alignment.center,
                                                    child: Opacity(
                                                        opacity: value,
                                                        child: child),
                                                  ),
                                              child: Align(
                                                  alignment: Alignment.center,
                                                  child: Padding(
                                                    padding: EdgeInsets.fromLTRB(
                                                        SizeConfig
                                                                .defaultWidth *
                                                            2,
                                                        0,
                                                        SizeConfig
                                                                .defaultWidth *
                                                            2,
                                                        0 > 0.462
                                                            ? SizeConfig
                                                                    .defaultHeight *
                                                                55
                                                            : SizeConfig.defaultHeight *
                                                                    20  
                                                                0 * 600),
                                                    child: Transform.scale(
                                                        scale: 0 > 0.462
                                                            ? 1 - (0 - 0.462)
                                                            : 1,
                                                        child: FlippableWidget(
                                                          frontWidget:
                                                              FrontCard(
                                                            HolderName: _produit[
                                                                "HolderName"],
                                                            Number: '5555555',
                                                            ExpiryNumber:
                                                                'aaaaaa',
                                                          ),
                                                        )),
                                                  ))),
                                        ],
                                      ),
                                    )));
                      },
                      child: Container(
                        padding: EdgeInsets.only(
                            bottom: SizeConfig.defaultHeight * 5),
                        child: FrontCard(
                          HolderName: 'aaaaaaaaaa',
                          Number: 'aaaaaa',
                          ExpiryNumber: 'aaaaaa',
                        ),
                      ),
                    ),
                  );
                }),
          ),
        ),
      );
}
  •  Tags:  
  • Related