Я изучаю дротик / флаттер, и у меня есть один демонстрационный проект электронной коммерции. Я загрузил изображение продукта, название и данные о цене в дочерний виджет с помощью POST API, которые мне нужно отправить в родительский виджет. Любая помощь? как показано ниже, я делюсь файлом дротика с кодом и хочу, чтобы элемент клика отображался в корзине, не переходя и не перемещаясь. Вот домашняя страница.

import 'dart:convert';
import 'package:ecom_demo/Screens/Details.dart';
import 'package:ecom_demo/Screens/MyCart.dart';
import 'package:flutter/material.dart';
import 'package:ecom_demo/Models/CartModel.dart';
import 'package:http/http.dart' as http;

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

class _HomePageState extends State<HomePage> {      

  final cartr = CartResponse();
   

 

  Future<CartResponse> getData() async {
    final response = await http.post(
        'http://205.134.254.135/~mobile/MtProject/api/v1/product_list',
        headers: {
          'token':
              'eyJhdWQiOiI1IiwianRpIjoiMDg4MmFiYjlmNGU1MjIyY2MyNjc4Y2FiYTQwOGY2MjU4Yzk5YTllN2ZkYzI0NWQ4NDMxMTQ4ZWMz',
        },
        body: jsonEncode({"page": 1, "perPage": 5}));

    if (response.statusCode == 200) {
      return CartResponse.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          Stack(children: [
            Text(''),
          ]),
          InkWell(
              onTap: () {
                Navigator.push(
                    context, MaterialPageRoute(builder: (context) => MyCart()));
              },
              child: Icon(Icons.shopping_cart))
        ],
        title: Text('HomePage'),
        centerTitle: true,
      ),
      body: FutureBuilder<CartResponse>(
        future: getData(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              shrinkWrap: true,
              itemCount: snapshot.data.data.length,
              itemBuilder: (BuildContext context, int index) {
                return Container(
                  height: MediaQuery.of(context).size.height * 0.7,
                  child: Column(
                    children: [
                      Expanded(
                          child: GestureDetector(
                        onTap: () {
                          Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) => Details(
                                        value: snapshot.data.data[index],
                                      )));
                        },
                        child: Image.network(
                          snapshot.data.data[index].featuredImage,
                          fit: BoxFit.cover,
                        ),
                      )),
                      Column(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                          ListTile(
                            leading: Text(
                              'Price:',
                              style: TextStyle(
                                  fontSize: 20, fontWeight: FontWeight.bold),
                            ),
                            title: Text(
                                snapshot.data.data[index].price.toString()),
                          ),
                          ListTile(
                            leading: Text(
                              'Title:',
                              style: TextStyle(
                                  fontSize: 20, fontWeight: FontWeight.bold),
                            ),
                            title: Text(snapshot.data.data[index].title),
                          ),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceAround,
                            children: [
                              OutlineButton(
                                onPressed: () {
                                 
                                },
                                child: Icon(Icons.delete),
                              ),
                              OutlineButton(
                                onPressed: () {
                               
                                },
                              ),
                            ],
                          ),
                        ],
                      )
                    ],
                  ),
                );
              },
            );
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }
}


here is my cart...            

    import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class MyCart extends StatelessWidget {

 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MyCart'),
        centerTitle: true,
      ),
      body: ListView.builder(
          itemCount: 2,
          itemBuilder: (BuildContext context, int index) {
            return Padding(
              padding: const EdgeInsets.all(12.0),
              child: Container(
                padding: EdgeInsets.all(5),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(18),
                    color: Colors.grey.withOpacity(0.2)),
                height: 150,
                width: MediaQuery.of(context).size.width,
                child: Row(
                  children: [
                    Expanded(
                      flex: 1,
                      child: Container(
                        color: Colors.red,
                      ),
                    ),
                    Expanded(
                      flex: 2,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        children: [
                          Text(''),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceAround,
                            children: [
                              Text('price:'),
                              Text('price'),
                            ],
                          ),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceAround,
                            children: [
                              Text('Quantity:'),
                              Text(""),
                            ],
                          )
                        ],
                      ),
                    )
                  ],
                ),
              ),
            );
          }),
      bottomSheet: Container(
        height: MediaQuery.of(context).size.height * 0.1,
        width: MediaQuery.of(context).size.width,
        decoration: BoxDecoration(
            borderRadius: BorderRadius.only(
                topRight: Radius.circular(25), topLeft: Radius.circular(25)),
            color: Colors.grey),
        child: Row(
          children: [
            Text(''),
          ],
        ),
      ),
    );
  }
}

cart model classs...

    
import 'dart:convert';

CartResponse cartResponseFromJson(String str) =>
    CartResponse.fromJson(json.decode(str));

String cartResponseToJson(CartResponse data) => json.encode(data.toJson());

class CartResponse {
  CartResponse({
    this.status,
    this.message,
    this.totalRecord,
    this.perPage,
    this.totalPage,
    this.data,
  });

  int status;
  String message;
  int totalRecord;
  int perPage;
  int totalPage;
  List<Datum> data;

  factory CartResponse.fromJson(Map<String, dynamic> json) => CartResponse(
    status: json["status"],
    message: json["message"],
    totalRecord: json["totalRecord"],
    perPage: json["perPage"],
    totalPage: json["totalPage"],
    data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "status": status,
    "message": message,
    "totalRecord": totalRecord,
    "perPage": perPage,
    "totalPage": totalPage,
    "data": List<dynamic>.from(data.map((x) => x.toJson())),
  };
}

class Datum {
  Datum({
    this.id,
    this.slug,
    this.title,
    this.description,
    this.price,
    this.featuredImage,
    this.status,
    this.createdAt,
  });

  int id;
  String slug;
  String title;
  String description;
  int price;
  String featuredImage;
  String status;
  DateTime createdAt;

  factory Datum.fromJson(Map<String, dynamic> json) => Datum(
    id: json["id"],
    slug: json["slug"],
    title: json["title"],
    description: json["description"],
    price: json["price"],
    featuredImage: json["featured_image"],
    status: json["status"],
    createdAt: DateTime.parse(json["created_at"]),
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "slug": slug,
    "title": title,
    "description": description,
    "price": price,
    "featured_image": featuredImage,
    "status": status,
    "created_at": createdAt.toIso8601String(),
  };
}


main.dart



        import 'package:ecom_demo/Screens/HomePage.dart';
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {



    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.deepOrange,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: HomePage(),
        );
      }
    }

  
0
Hemant Jam 19 Янв 2021 в 15:19

2 ответа

Лучший ответ

Не уверен, правильно ли я получил ваш вопрос, но если вы хотите передать любой тип значения от дочернего элемента к родительскому, вы можете сделать следующее:

Допустим, у вас есть виджеты Page1 [parent] и Page2 [child], и вы хотите передать строку «hello world» со страницы 2 на страницу 1.

1) В виджете Page2:

Когда вы выходите из Page2 с помощью Navigator.pop, вы можете передать значение, передав его как параметр следующим образом:

Navgiator.pop(context,"hello world");

2) В виджете Page1:

Как вы, возможно, знаете, когда вы помещаете Page2 в стек с помощью Navigator.push, это асинхронный метод, который ожидает, пока Page2 не появится. Итак, перейдите в то место, где вы использовали Navigator.push (), и добавьте метод .then. Итак, конечный продукт будет примерно таким:

Navigator.push(
      context,
      MaterialPageRoute(
            builder: (context) => Details(value: snapshot.data.data[index],)
     )
).then(result){
   print("Result received from Page2 : $result");
};

Этот оператор печати напечатает нашу результирующую строку «hello world».

0
Dharman 19 Янв 2021 в 20:04

Это просто с решением для управления состоянием, например InheritedWidget, Provider или Riverpod. Ознакомьтесь с мнением Google на странице https://flutter.dev/. docs / development / data-and-backend / state-mgmt / options.

0
Randal Schwartz 19 Янв 2021 в 23:27