Manejo de estados en Flatter, 공급업체

33754 단어
En esta guía se mostraráel uso de Provider para el manejo de estados En flatter.

El código de esta guía se lo puede encontrar en GitHub.

삼면체 / 진동 상태 관리 프레젠테이션


Manejo de estados en flatter 회사


중요했어


La rama provider es La que tiene La implementación de esta guía.
라마 마스터 tiene el código base de La aplicación.
La aplicaci ón cuenta con tres 원경:
  • 사용자: Enesta vistaal cambiar los valores del campo de texto también se actualizar á el título del AppBar,adem ás se actualizar á En nombre de usuario En la vista cart.
  • 디렉터리: En esta vista se muestra un listado de Items y al interactiuar con cada uno de ellos se puede ver que el í cono para agregar/eliminar cambia, tambié n se impleza el contador de Items del AppBar y el listado de Items de la vista cart.
  • 쇼핑카트: Enesta vista se muestra un listado de los productos que se han seleccionado En la vista de catalog también se muestra el precio total y el nombre de usuario junto con las iniciales del mismo En un Circle Avatar.
  • Para mantener el código ordenado se creóla carpeta providers y dentro de esta los archivos catalog_provider.dart,user_provider.쏜살같이 달리다
  • 공급업체
  • catalog_제공 프로그램.dart
  • user_provider.dart
  • Índice

  • Instalar Provider
  • Provider para nombre de usuario
  • Provider para catálogo
  • Modificar main.dart

  • Vistas
  • user.dart
  • catalog.dart
  • cart.dart
  • Instalar 공급업체


    https://pub.dev/packages/provider
    Para este ejemplo se ha utilizado la versión4.3.2+2공공 규범.아마르
    dependencies:
      provider: ^4.3.2+2
    

    공급자para nombre de usuario


    user_제공 프로그램.쏜살같이 달리다


    import 'package:flutter/material.dart';
    
    class UserProvider with ChangeNotifier {
      String _username = 'Guest';
    
      String get username => _username;
    
      void onChange(value) {
        _username = value;
        notifyListeners();
      }
    }
    
    설명:
    리브레아 재료를 수입하다.dart ya que se va a usar como mixin ChangeNotifier en la clase UserProvider
    import 'package:flutter/material.dart';
    
    Crear la clase 사용자 공급자 y utilizar como mixin la clase ChangeNotifier
    class UserProvider with ChangeNotifier {
      ...
    }
    
    Crear una variable privada que va a contener el nombre de usuario,también agregar un getter para que se pueda obtener este valor fuera de la clase UserProvider.
    String _username = 'Guest';
    
    String get username => _username;
    
    Crear un método que va a actualizar el nombre de usuario y a su vez va a notificiar los cambios.
    void onChange(value) {
      _username = value;
    
    // Notificar los cambios con notifyListeners();
      notifyListeners();
    }
    

    공급자paracatá 로고


    catalog_ 제공 프로그램.쏜살같이 달리다


    import 'package:flutter/material.dart';
    import 'package:state_management/models/item_model.dart';
    
    class CatalogProvider with ChangeNotifier {
      List<ItemModel> _catalog = [];
    
      List<ItemModel> get catalog => _catalog;
    
      void addToCatalog(ItemModel itemModel) {
        _catalog.add(itemModel);
        notifyListeners();
      }
    
      void removeFromCatalog(ItemModel itemModel) {
        _catalog.remove(itemModel);
        notifyListeners();
      }
    }
    
    설명:
    Al igual que con user_ 제공 프로그램.dartes necesario importar la librer ía 재료.dart,pero esta vez también va a ser necesario item_모델.dartyaque se van a usarobjetos de tipo 프로젝트 모델.
    import 'package:flutter/material.dart';
    import 'package:state_management/models/item_model.dart';
    
    Crear la clase CatalogProvider y utilizar como mixin la clase ChangeNotifier
    class CatalogProvider with ChangeNotifier {
      ...
    }
    
    Crear una variable privada que va a contener el listado de items,también agregar un getter para que se pueda obtener este listado fuera de la clase CatalogProvider.
    List<ItemModel> _catalog = [];
    
    List<ItemModel> get catalog => _catalog;
    
    Crear un método para agregar un nuevo item al listado y a su vez va a notificar los cambios.
    void addToCatalog(ItemModel itemModel) {
      _catalog.add(itemModel);
    
    // Notificar los cambios con notifyListeners();
      notifyListeners();
    }
    
    Crear otro método para eliminar un newevo item del listado y a su vez va a notificar los cambios.
    void removeFromCatalog(ItemModel itemModel) {
      _catalog.remove(itemModel);
    
    // Notificar los cambios con notifyListeners();
      notifyListeners();
    }
    

    Modificar main。쏜살같이 달리다


    import 'package:provider/provider.dart';
    import 'package:state_management/providers/catalog_provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    
    ...
    
    void main() => runApp(
          MultiProvider(
            providers: [
              ChangeNotifierProvider(create: (_) => UserProvider()),
              ChangeNotifierProvider(create: (_) => CatalogProvider())
            ],
            child: MyApp(),
          ),
        );
    
    설명:
    Importar la librer ía 공급업체.dartademás de los archivos catalog_ 공급업체.dart y user_ 제공 프로그램.쏜살같이 달리다
    import 'package:provider/provider.dart';
    import 'package:state_management/providers/catalog_provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    
    el método 원본 수정void main() => runApp(MyApp());Porque se deben crear los providers el nivel más alto posible en la jerarquía de widgets.
    void main() => runApp(
    // Agregar un MultiProvider ya que se van a utilizar varios providers
          MultiProvider(
            providers: [
    
    // Crear el CatalogProvider
              ChangeNotifierProvider(create: (_) => UserProvider()),
    
    // Crear el UserProvider
              ChangeNotifierProvider(create: (_) => CatalogProvider())
            ],
    
    // Pasar MyApp() como widget hijo
            child: MyApp(),
          ),
        );
    

    원경


    En esta sección se mostrarálos cambios necesarios a realizar para que las vistas se actualizen usando providers.

    사용자쏜살같이 달리다


    import 'package:provider/provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    
    ...
    
    @override
    void initState() {
      super.initState();
    
      _textEditingController =
          TextEditingController(text: context.read<UserProvider>().username);
    }
    
    ...
    
    final _userProvider = Provider.of<UserProvider>(context);
    
    ...
    
    title: Text('User - ${_userProvider.username}'),
    
    ...
    
    onChanged: (value) {
      _userProvider.onChange(value);
    },
    
    설명:
    Importar la librer ía 공급업체.dart y el archivo user_provider.쏜살같이 달리다
    import 'package:provider/provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    
    Sobrecribir el métodoinitStatepara pasar el nombre de usuario al TextEditingController,esto se hace para tener un valor por default en el campo de texto.
    @override
    void initState() {
      super.initState();
    
    // Obtener el nombre de usuario fuera de una vista con
    // context.read<UserProvider>().username
      _textEditingController =
          TextEditingController(text: context.read<UserProvider>().username);
    }
    
    Agregar una variable privada en el métodobuildque contenga UserProvider
    final _userProvider = Provider.of<UserProvider>(context);
    
    Agregar el nombre de Usario al título del AppBar usando_userProvider.username
    title: Text('User - ${_userProvider.username}'),
    
    Llamar el métodoonChangede UserProvider al momento de hacer un cambio en el campo de texto.
    onChanged: (value) {
      _userProvider.onChange(value);
    },
    

    카탈로그쏜살같이 달리다


    import 'package:provider/provider.dart';
    import 'package:state_management/providers/catalog_provider.dart';
    
    ...
    
    child: CircleAvatar(
      child: Text(
        '${context.watch<CatalogProvider>().catalog.length}',
    
    ...
    
    @override
    Widget build(BuildContext context) {
      final _catalogProvider =
          Provider.of<CatalogProvider>(context, listen: false);
    
    ...
    
    trailing: IconButton(
      onPressed: () {
        if (items[index].addedToCart) {
          _catalogProvider.removeFromCatalog(items[index]);
        } else {
          _catalogProvider.addToCatalog(items[index]);
        }
    
    설명:
    Importar la librer ía 공급업체 y el archivo catalog_공급업체.쏜살같이 달리다
    import 'package:provider/provider.dart';
    import 'package:state_management/providers/catalog_provider.dart';
    
    프로젝트 구현context.watch
    child: CircleAvatar(
      child: Text(
        '${context.watch<CatalogProvider>().catalog.length}',
    
    Crear una variable privada de tipo provider,pero creada con el parámetrolistenen false,ya que se va a utilizar para actualizar datos del provider no para obtenerlos.
    @override
    Widget build(BuildContext context) {
      final _catalogProvider =
          Provider.of<CatalogProvider>(context, listen: false);
    
    Utilizar_catalogProviderpara remover o agregar items al listado de items.
    trailing: IconButton(
      onPressed: () {
        if (items[index].addedToCart) {
          _catalogProvider.removeFromCatalog(items[index]);
        } else {
          _catalogProvider.addToCatalog(items[index]);
        }
    

    짐마차쏜살같이 달리다


    import 'package:state_management/providers/catalog_provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    import 'package:provider/provider.dart';
    
    ...
    
    @override
      Widget build(BuildContext context) {
        final _userProvider = Provider.of<UserProvider>(context);
        final _catalogProvider = Provider.of<CatalogProvider>(context);
    
    ...
    
    child: ListView.builder(
      itemCount: _catalogProvider.catalog.length,
      itemBuilder: (context, index) => ListTile(
        title: Text(
          '${_catalogProvider.catalog[index].name}'.toUpperCase(),
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
        trailing: Text(
          '\$${_catalogProvider.catalog[index].price.toStringAsFixed(2)}',
        ),
      ),
    ),
    
    ...
    
    Column(
      children: [
        CircleAvatar(
          child: Text(
              getInitials(_userProvider.username).toUpperCase()),
        ),
        Text(
          '${_userProvider.username}',
          style: TextStyle(
            fontWeight: FontWeight.bold,
          ),
        ),
      ],
    ),
    
    ...
    
    Text(
      '\$${formatTotal(_catalogProvider.catalog)}',
    
    설명:
    Importar la librer ía 공급자와 los archivos catalog_ 공급자.dart y user_ 제공 프로그램.쏜살같이 달리다
    import 'package:state_management/providers/catalog_provider.dart';
    import 'package:state_management/providers/user_provider.dart';
    import 'package:provider/provider.dart';
    
    Crear dos variables privadas,para obtener los datos del provider de user y catalog.
    @override
      Widget build(BuildContext context) {
        final _userProvider = Provider.of<UserProvider>(context);
        final _catalogProvider = Provider.of<CatalogProvider>(context);
    
    현실주의자ListView.builder
    child: ListView.builder(
    
    // Actualizar el contador de items.
      itemCount: _catalogProvider.catalog.length,
      itemBuilder: (context, index) => ListTile(
        title: Text(
    
    // Mostrar el nombre del item.
          '${_catalogProvider.catalog[index].name}'.toUpperCase(),
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
        trailing: Text(
    
    // Mostrar el precio del producto con dos decimales.
    '\$${_catalogProvider.catalog[index].price.toStringAsFixed(2)}',
        ),
      ),
    ),
    
    우사리오의 이름이다.
    Column(
      children: [
        CircleAvatar(
          child: Text(
    
    // Mostrar las iniciales del nombre de usuario
              getInitials(_userProvider.username).toUpperCase()),
        ),
        Text(
    
    // Mostrar el nombre de usuario
          '${_userProvider.username}',
          style: TextStyle(
            fontWeight: FontWeight.bold,
          ),
        ),
      ],
    ),
    
    모든 프로젝트를 실현하다.
    Text(
      '\$${formatTotal(_catalogProvider.catalog)}',
    
    Eso es todo,recuerda que código de esta guía se lo puede encontrar en GitHub.

    삼면체 / 진동 상태 관리 프레젠테이션


    Manejo de estados en flatter 회사

    좋은 웹페이지 즐겨찾기