首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetX状态管理

GetX状态管理
EN

Stack Overflow用户
提问于 2020-08-06 15:56:34
回答 3查看 18.6K关注 0票数 1

我开始学习颤振课程,在状态管理部分,我决定学习GetX状态管理。

无论如何,在这个商店教程,我试图改变图标状态时,按下,但它没有。

文件product_item.dart

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:getx_pattern/app/ui/android/products_overview/widgets/product_details.dart';
import 'package:get/get.dart';

import '../../../theme/app_theme.dart';
import './product.dart';
import './products.dart';

class ProductItem extends StatelessWidget {
  final pIndex;
  // final String title;
  // final String imageUrl;

  ProductItem({
    this.pIndex,
  });

  productDetails() {
    Get.to(
      ProductDetailScreen(),
      arguments: product.findById(pIndex.id).title,
      transition: Transition.rightToLeft,
    );
  }

  final Products product = Get.put(Products());
  // final Product pp = Get.put(Product(
  //     id: null, title: null, description: null, price: null, imageUrl: null));

  @override
  Widget build(BuildContext context) {
    return ClipRRect(
      borderRadius: BorderRadius.circular(10.0),
      child: GetBuilder<Products>(
        builder: (_) => GridTile(
          child: GestureDetector(
            onTap: () => productDetails(),
            child: Image.network(
              product.findById(pIndex.id).imageUrl,
              fit: BoxFit.cover,
            ),
          ),
          footer: GridTileBar(
            backgroundColor: Colors.black87,
            leading: IconButton(
                icon: Icon(product.findById(pIndex.id).isFavorite
                    ? Icons.favorite
                    : Icons.favorite_border),
                color: appThemeData.accentColor,
                onPressed: () {
                  product.findById(pIndex.id).toggleFavoriteStatus();
                  // print(_.items[pIndex].isFavorite);
                }),
            trailing: IconButton(
                icon: Icon(Icons.shopping_cart),
                color: appThemeData.accentColor,
                onPressed: () {}),
            title: Text(
              product.findById(pIndex.id).title,
              textAlign: TextAlign.center,
            ),
          )),
      ));
  }
}

文件product.dart

代码语言:javascript
复制
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';

class Product extends GetxController {
  final String id;
  final String title;
  final String description;
  final double price;
  final String imageUrl;
  bool isFavorite;

  Product({
    @required this.id,
    @required this.title,
    @required this.description,
    @required this.price,
    @required this.imageUrl,
    this.isFavorite = false,
  });

  void toggleFavoriteStatus() {
    isFavorite = !isFavorite;
    update();
  }
}

文件products.dart

代码语言:javascript
复制
import 'package:get/get.dart';

import 'product.dart';

class Products extends GetxController {
  List<Product> items = [];

  Products();

  @override
  onInit() {
    items = [
      Product(
        id: 'p1',
        title: 'Red Shirt',
        description: 'A red shirt - it is pretty red!',
        price: 29.99,
        imageUrl:
            'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
      ),
      Product(
        id: 'p2',
        title: 'Trousers',
        description: 'A nice pair of trousers.',
        price: 59.99,
        imageUrl:
            'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px-Trousers%2C_dress_%28AM_1960.022-8%29.jpg',
      ),
    ];
    update();
    super.onInit();
  }

  List get myitems => [...items];

  Product findById(String id) {
    return items.firstWhere((prod) => prod.id == id);
  }

  void addProduct() {
    //_items.add(value);
    update();
  }
}

文件products_grid

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import './product.dart';
import './product_item.dart';
import './products.dart';

class ProductsGrid extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetBuilder<Products>(
      init: Products(),
      builder: (data) => GridView.builder(
          padding: const EdgeInsets.all(10.0),
          itemCount: data.items.length,
          itemBuilder: (ctx, index) => ProductItem(
                pIndex: data.items[index],
              ),
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 3 / 2,
            crossAxisSpacing: 10,
            mainAxisSpacing: 10,
          )),
    );
  }
}

文件product_details

代码语言:javascript
复制
import 'package:getx_pattern/app/ui/android/products_overview/widgets/products.dart';

import '../../../theme/app_theme.dart';

class ProductDetailScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: appThemeData,
      home: SafeArea(
        child: Scaffold(
          appBar: AppBar(
              title: GetBuilder<Products>(
            init: Products(),
            builder: (data) => Text(Get.arguments),
          )),
        ),
      ),
    );
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-06 17:24:44

我刚刚通过将方法从文件product.dart中移出来解决这个问题,

代码语言:javascript
复制
void toggleFavoriteStatus() {
    isFavorite = !isFavorite;
    update();
}

提交products.dart

代码语言:javascript
复制
void toggleFavoriteStatus(String id) {
    items.firstWhere((prod) => prod.id == id).isFavorite =
        !items.firstWhere((prod) => prod.id == id).isFavorite;
    update();
}
票数 9
EN

Stack Overflow用户

发布于 2021-01-23 12:16:04

我不知道你到底想做什么。如果这是一个数据库获取与get,我使用的模型‘?’属性如下,而不是:

代码语言:javascript
复制
Image.network(
    product.findById(pIndex.id).imageUrl,
    fit: BoxFit.cover,
 ),...

我用:

代码语言:javascript
复制
Image.network(
    product?.imageUrl,
    fit: BoxFit.cover,
),...
票数 0
EN

Stack Overflow用户

发布于 2021-03-09 15:55:56

这是因为您正在更新product控制器,但在GetBuilder中使用products控制器。我的意思是您的GetBuilder必须使用更新后的控制器,但是您使用的是GetBuilder<Products>(... (而不是GetBuilder<Product>(...)。

因此,解决这个问题有两种可能的方法:

第一:正如MNMB所说,是更新Products控制器。

第二:在GetBuilder<Products>(...小部件中将GetBuilder<Product>(...更改为GetBuilder<Product>(...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63287437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档