Ad

Flutter : I Want To Pass (title,details,content) To Details Page Display It In Vertically In Top Of The Details Page?

- 1 answer

eg: details about the questions ......................................................when i click to a gridview item i want to pass (title,details,content) to details page display in vertically in top of the details page but when i am pass the data not able to fetch the data in details page i created a constrctor in details page not able to set the data in text and image.

Home Page 
----------

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'DetailsPage.dart';
var paddingBottom = 48.0;

class HomePage extends StatelessWidget {
  final String apiUrl = "https://www.sofikart.com/MobileApi/banners";
  final String apiUrl1 =
      "https://wayindia.net/indigo/odia_rashifal/rasifhala.php";

  Future<List<dynamic>> fetchUsers() async {
    var result = await http.get(Uri.parse(apiUrl1));
    return json.decode(result.body)['data'];
  }

  String id(dynamic user) {
    return user['id'];
  }

  String title(dynamic user) {
    return user['title'];
  }

  String content(dynamic user) {
    return user['content'];
  }

  String eng_title(dynamic user) {
    return user['eng_title'];
  }

  String main_img(dynamic user) {
    return user['main_img'];
  }

  String image_2(dynamic user) {
    return user['image_2'];
  }

  String image_3(dynamic user) {
    return user['image_3'];
  }

  String image_4(dynamic user) {
    return user['image_4'];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ଆଜିର ରାଶିଫଳ'),
        centerTitle: true,
      ),
      body: Container(
        child: FutureBuilder<List<dynamic>>(
          future: fetchUsers(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              print(id(snapshot.data[0]));

              return GridView.builder(
                itemCount: snapshot.data.length,
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 3,
                  crossAxisSpacing: 20,
                  mainAxisSpacing: 25,
                ),
                padding: EdgeInsets.all(13),
                shrinkWrap: true,
                itemBuilder: (ctx, index) {
                  return InkWell(
                    child: Container(
                      decoration: BoxDecoration(
                          color: Colors.transparent,
                          borderRadius: BorderRadius.all(Radius.circular(12))),
                      child: Column(
                        children: [
                          Expanded(
                            flex: 9,
                            child: ClipRRect(
                                borderRadius:
                                    BorderRadius.all(Radius.circular(12)),
                                child: Image.network(
                                    snapshot.data[index]['main_img'],
                                    fit: BoxFit.fill)),
                          ),
                          Expanded(
                              flex: 2,
                              child: Text(
                                title(snapshot.data[index]),
                                style: TextStyle(
                                    color: Colors.black, fontSize: 17),
                              )),
                        ],
                      ),
                    ),
                    onTap: () {
                      print("Click event on Container");
                      Navigator.of(context).pushAndRemoveUntil(
                          MaterialPageRoute(builder: (context) => DetailsPage()), (route) => false);
                    },
                  );
                },
              );
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        ),
      ),
    );
  }
}
   
Details Page 
------------

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:odia_rasiphala/HomePage.dart';
import 'dart:convert';

class DetailsPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {


    return WillPopScope(
        onWillPop: () async => false,
        child: new Scaffold(
          appBar: new AppBar(
            title: new Text('ଆଜିର ରାଶିଫଳ'),
            leading: new IconButton(
              icon: new Icon(Icons.arrow_back_outlined),
              onPressed: () => Navigator.pushReplacement(context,
                  new MaterialPageRoute(builder: (context) => HomePage())),
            ),
            actions: [
              IconButton(
                onPressed: () {},
                icon: Icon(Icons.share),
              ),
            ],
          ),
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Image.network(
                '',
                width: 200.0,
                height: 200.0,
              ),
              new Center(
                child: new Text('',style: TextStyle(
                    color: Colors.black,fontSize: 17
                )),
              )
            ],
          ),
        ));
  }
}
Ad

Answer

I am guessing you want to pass "eng_title" and "main_img" to details screen.

To do that first make a constructor in your details pages. Example:

class DetailScreen extends StatelessWidget {
  // In the constructor, require a Todo.
  const DetailScreen({Key? key, required this.eng_title, required this.main_img}) : super(key: key);

  // Declare a field that holds the strings passed to this class.
  final String eng_title;
  final String main_img;

  @override
  Widget build(BuildContext context) {
    // Use the final parameters to create the UI.
    return Scaffold(
      appBar: AppBar(
        title: Text(eng.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Text(main_img),
      ),
    );
  }
}

on your OnTap function, when you click an item on the list, just pass the required parameters like this

onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => DetailScreen(eng_title: snapshot.data[index]['eng_title'], main_img: snapshot.data[index]['main_img']),
          ),
        );
      },

This way you can pass data from onescreen to another. Do not use push and remove until, if you want the user to go back to the list in homepage.

For more info about passing data read the following article by flutter: https://docs.flutter.dev/cookbook/navigation/passing-data

Ad
source: stackoverflow.com
Ad