簡體   English   中英

如何在 Flutter 中啟用 Multiprovider 4.0.0 中的構建器

[英]how to enable builder in Multiprovider 4.0.0 in flutter

我在提供程序版本 3.0.0 中工作,它向我顯示了這個錯誤:

'builder' 已被棄用,不應使用。 將在 4.0.0 中刪除,請改用更新。 嘗試將已棄用成員的使用替換為 replacement.dart

這是我的 main.dart 代碼:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'screens/auth_screen.dart';
import './screens/cart_screen.dart';
import './screens/products_overview_screen.dart';
import './screens/product_detail_screen.dart';
import './providers/products.dart';
import './providers/cart.dart';
import './providers/orders.dart';
import './screens/orders_screen.dart';
import './screens/user_products_screen.dart';
import './screens/edit_product_screen.dart';
import 'providers/Auth.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [

        ChangeNotifierProvider.value(
          value: Auth(),
          ),
       ChangeNotifierProxyProvider<Auth, Products>(  
         builder: (ctx, auth, previousProducts) => Products(
                auth.token,
                previousProducts == null ? [] : previousProducts.items,
              ),

        ),
        ChangeNotifierProvider.value(
          value: Cart(),
        ),
        ChangeNotifierProvider.value(
          value: Orders(),
        ),
      ],
      child: Consumer<Auth>(builder: (ctx, auth , _)=>MaterialApp(
          title: 'MyShop',
          theme: ThemeData(
            primarySwatch: Colors.purple,
            accentColor: Colors.deepOrange,
            fontFamily: 'Lato',
          ),
          home: auth.isAuth? ProductsOverviewScreen(): AuthScreen(),
          routes: {
            ProductDetailScreen.routeName: (ctx) => ProductDetailScreen(),
            CartScreen.routeName: (ctx) => CartScreen(),
            OrdersScreen.routeName: (ctx) => OrdersScreen(),
            UserProductsScreen.routeName: (ctx) => UserProductsScreen(),
            EditProductScreen.routeName: (ctx) => EditProductScreen(),
          }), ),

    );
  }
}

這是我的身份驗證類代碼

import 'dart:convert';
import 'package:flutter/widgets.dart';
import '../models/Exceptionhandle.dart';
import 'package:http/http.dart' as http;

class Auth with ChangeNotifier {
  String _token;
  DateTime _expiryDate;
  String _userId;

  bool get isAuth {
    return token != null;
  }

  String get token {
    if (_expiryDate != null &&
        _token != null &&
        _expiryDate.isAfter(DateTime.now())) {
      return _token;
    }
    return null;
  }

  Future<void> _authnticate(
      String email, String password, String urlSegment) async {
    final url =
        'https://www.googleapis.com/identitytoolkit/v3/relyingparty/$urlSegment?key=AIzaSyAt_rZWIJtr6pHX6sFipo9RDdpMadIpsYk';
    try {
      final response = await http.post(
        url,
        body: json.encode(
          {
            'email': email,
            'password': password,
            'returnSecureToken': true,
          },
        ),
      );
      final responseData = json.decode(response.body);
      if (responseData['error'] != null) {
        throw ExceptionHandle(responseData['error']['message']);
      }
      _token = responseData['idToken'];
      _userId = responseData['localId'];
      _expiryDate = DateTime.now().add(
        Duration(
          seconds: int.parse(
            responseData['expiresIn'],
          ),
        ),
      );
      notifyListeners();
    } catch (error) {
      throw error;
    }
  }

  Future<void> signup(String email, String password) async {
    return _authnticate(email, password, 'signupNewUser');
  }

  Future<void> login(String email, String password) async {
    return _authnticate(email, password, 'verifyPassword');
  }
}

這是我的產品類代碼:

import 'dart:convert';
import '../models/Exceptionhandle.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

import './product.dart';

class Products with ChangeNotifier {

  List<Product> _items = [];

String authToken;
Products(this.authToken , this._items) ;
  List<Product> get items {
    return [..._items];
  }

  List<Product> get favoriteItems {
    return _items.where((prodItem) => prodItem.isFavorite).toList();
  }

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

  Future<void> fetchAndSetProducts() async {
    const url = 'https://shopapp-76e9d.firebaseio.com/products.json';
    try {
      final response = await http.get(url);
      final extractData = json.decode(response.body) as Map<String, dynamic>;
      if (extractData == null) {
        return;
      }
      final List<Product> LoadedProducts = [];
      extractData.forEach((prodId, ProdData) {
        LoadedProducts.add(Product(
            id: prodId,
            title: ProdData['title'],
            description: ProdData['description'],
            imageUrl: ProdData['imageUrl'],
            isFavorite: ProdData['isFavorite'],
            price: ProdData['price']));
      });
      _items = LoadedProducts;
      notifyListeners();
    } catch (error) {
      throw error;
    }
  }

  Future<void> addProduct(Product product) async {
    const url = 'https://shopapp-76e9d.firebaseio.com/products.json';
    try {
      final response = await http.post(
        url,
        body: json.encode({
          'title': product.title,
          'description': product.description,
          'imageUrl': product.imageUrl,
          'price': product.price,
          'isFavorite': product.isFavorite,
        }),
      );
      final newProduct = Product(
        title: product.title,
        description: product.description,
        price: product.price,
        imageUrl: product.imageUrl,
        id: json.decode(response.body)['name'],
      );
      _items.add(newProduct);
      notifyListeners();
    } catch (error) {
      print(error);
      throw error;
    }
  }

  void updateProduct(String id, Product newProduct) async {
    final prodIndex = _items.indexWhere((prod) => prod.id == id);
    if (prodIndex >= 0) {
      final url = 'https://shopapp-76e9d.firebaseio.com/products/$id.json';
      await http.patch(url,
          body: json.encode({
            'title': newProduct.title,
            'description': newProduct.description,
            'imageUrl': newProduct.imageUrl,
            'price': newProduct.price,
          }));
      _items[prodIndex] = newProduct;
      notifyListeners();
    } else {
      print('...');
    }
  }

  Future<void> deleteProduct(String id) async {
    final url = 'https://shopapp-76e9d.firebaseio.com/products/$id.json';
    final existingProductIndex = _items.indexWhere((prod) => prod.id == id);
    var existingproduct = _items[existingProductIndex];
    _items.removeAt(existingProductIndex);
    notifyListeners();
    final response = await http.delete(url);
    if (response.statusCode >= 400) {
      _items.insert(existingProductIndex, existingproduct);
      notifyListeners();
      throw ExceptionHandle('Ops..!! Sorry Could Not Delete This Product.');
    }
    existingproduct = null;
  }
}

誰能指導我如何使用構建器而不是更新和創建?

update添加到您的ChangeNotifierProxyProvider並將build更改為create

ChangeNotifierProxyProvider<MyModel, MyChangeNotifier>(
  create: (_) => MyChangeNotifier(),
  update: (_, myModel, myNotifier) => myNotifier
    ..update(myModel),
  child: ...
);

請參閱: https : //github.com/rrousselGit/provider/blob/master/README.md#ProxyProvider

https://pub.dev/documentation/provider/latest/provider/ChangeNotifierProxyProvider-class.html

編輯:

嘗試這個

ChangeNotifierProxyProvider<Auth, Products>(
    create: (c) => Products(Provider.of<Auth>(c, listen: false).token),
    update: (_, auth, products) => products.authToken = auth.token,
),

你可以這樣使用它:

ListView.builder(
              physics: NeverScrollableScrollPhysics(),
              scrollDirection: Axis.vertical,
              itemCount: rrr.length,
              itemBuilder: (ctx, index) => ChangeNotifierProvider.value(
                  value: rrr[index],
                      child: ChildItem()),
            ),

有關提供者內容的信息在ChildItem()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM