Similar a la manera en que declaramos e incorporamos los recursos de tipografía en la clase anterior, las imágenes al ser también recursos externos, deberán ser guardadas en un directorio particular que llamaremos assets/ y declaradas en el archivo pubspecs.yaml de la siguiente manera:
...
assets:
- <ubicación del recurso en la estructura de archivos del proyecto>...
Una vez declarado el recurso de imagen en el archivo de configuraciones, lo incorporamos al código mediante el widgetAssetImage( “<ubicación del asset>” ) que a su vez colocaremos como valor de la propiedad image de un widgetDecorationImage, o de cualquier otro widget que disponga de la propiedad image, como es el caso del BoxDecoration.
Existe un widget que me gusta usar cuando se necesitan imagenes circulares, CircleAvatar
CircleAvatar
Un círculo que representa a un usuario.
Normalmente se utiliza con la imagen de perfil de un usuario o, en ausencia de dicha imagen, las iniciales del usuario.
Waaaooo!!
Ojo el CircleAvatar es una clase de Flutter que nos permite con una sola linea de codigo crear una imagen circular :
String imgUrl ="la url de una imagen en internet"CircleAvatar(//backgroundImage:NetworkImage(imgUrl),),
Ahora esta clase no acepta recibir parametros como height y width, directamente como si de un texto se tratase, asi que la mejor forma de cambiar las dimensiones del avatar es con un Container que lo envuelva y a este container cambiarle sus dimensiones.
final avatar =Container(height:100,width:100,margin:EdgeInsets.only(top:10,left:10),child:CircleAvatar(////backgroundImage: NetworkImage(imgUrl),),);return avatar;
Únicamente restaría agregar el widget al archivo main.dart y llamarlo dentro del body.
Excelente
Logre crear la parte de Reviews solo leyendo la documentación y probando por mi mismo con lo que nos ha enseñado Anahi hasta ahora, aquí comparto como lo hice.
Para tener mayor calidad en sus aplicaciones yo he utilizado esta página para obtener imágenes:
https://unsplash.com/
Son gratuitas y muy buenas, de ser posible den reconocimiento a los creadores.
Estas imágenes son de muy alta calidad, recomiendo buscar métodos para reducir esto y que su app no este tan cargada.
Muy buen recurso, muchas gracias.
Que buen aporte compañero.
Tendran la version del curso actulizada es que no sirve para la version 2
No sé a qué te refieres que no sirve, a mí hasta el momento todo me ha funcionado y vengo de la versión más reciente.
Mi pregunta es porque no me sale la imagen ??
en el pubspec como tienes declarado la carpeta contenedora de las imagenes?
Es posible que no llamaras al archivo, recuerda que debes importar el archivo y después llamar al constructor con el parámetro de la ruta de la imagen en el archivo que lo quieras implementar.
Amigos de platzi, ¿Para cuando tendrán planeado la actualización de este curso?
Entiendo que han pasado ya 4 años del curso, pero en su mayoría, por no decir todo, es básicamente lo mismo hasta ahora a la versión actual, y en caso de que algo cambie se puede checar la documentación.
El problema es con la característica NULL SAFETY...
Como podria traer la imagen desde una Url Externa?
Deben hacer los retos, porque ellos fortalecen su aprendizaje 😃
Hola Ann!
¿Cuando pensas que puede estar el curso avanzado de Flutter?
Hola, ya tenemos el Curso Avanzado en Flutter :) platzi.com/cursos/flutter-avanzado/
Could not update files on device: FileSystemException: Cannot open file, path = 'D:\Flutter Visual Studio Code\Platzi\app_platzi\assets\img\people.jpg' (OS Error: El sistema no puede encontrar la ruta especificada.
, errno = 3)
Como soluciono eso ?
Se me ocurre que el nombre de la ruta esté mal escrito o que no este implementado en el archivo pubspec.yaml.
Tengo un problema, no me muestra la imagen de los reviews. Me pueden ayudar?
Codigo de Review
import'package:flutter/cupertino.dart';import'package:flutter/material.dart';classReviewextendsStatelessWidget{String path ="assets/img/sebas.jpg";String name="Sebas";String details ="1 comentario y 5 fotos";String comment ="Es un increible lugar las Bahamas para divertirse y pasarla bien";Review(this.path,this.name,this.details,this.comment);
@override
Widgetbuild(BuildContext context){// TODO: implement build final userComment =Container(margin:EdgeInsets.only(left:20.0,),child:Text( comment,textAlign:TextAlign.left,style:TextStyle(fontSize:17.0,fontFamily:"Lato",fontWeight:FontWeight.w900),)); final userInfo =Container(margin:EdgeInsets.only(left:20.0,),child:Text( details,textAlign:TextAlign.left,style:TextStyle(fontSize:13.0,fontFamily:"Lato",color:Color(0xFFa3a5a7),),)); final userName =Container(margin:EdgeInsets.only(left:20.0,),child:Text( name,textAlign:TextAlign.left,style:TextStyle(fontSize:17.0,fontFamily:"Lato",),)); final star =Container(margin:EdgeInsets.only(top:100.0,right:2.0),child:Icon(Icons.star,color:Colors.amberAccent,),); final userDetails =Column(crossAxisAlignment:CrossAxisAlignment.start,children:<Widget>[ userName, userInfo, userComment
],); final photo =Container(margin:EdgeInsets.only(top:20.0,left:20.0),width:80.0,height:80.0,decoration:BoxDecoration(shape:BoxShape.circle,image:DecorationImage(fit:BoxFit.cover,image:AssetImage(path))),);returnRow(children:<Widget>[ photo, userDetails
],);}}
Codigo de pubspec.yaml
name: com
description:AnewFlutter application.# The following defines the version and build number for your application.# A version number is three numbers separated by dots, like 1.2.43# followed by an optional build number separated by a +.# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.# InAndroid, build-name is used as versionName while build-number used as versionCode.# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used asCFBundleShortVersionStringwhile build-number used asCFBundleVersion.# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.htmlversion:1.0.0+1environment:sdk:">=2.1.0<3.0.0"dependencies:flutter:sdk: flutter
# The following adds the CupertinoIcons font to your application. # Usewith the CupertinoIconsclassfor iOS style icons.cupertino_icons:^0.1.2dev_dependencies:flutter_test:sdk: flutter
# For information on the generic Dart part ofthis file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.flutter: # The following line ensures that the MaterialIcons font is
# included with your application, so that you can use the icons in # the material Iconsclass.uses-material-design:true # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware. # For details regarding adding assets frompackage dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here, # inthis"flutter" section.Each entry inthis list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font.For # example: # fonts: # - family:Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic
# - family:TrajanPro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight:700 #
# For details regarding fonts frompackage dependencies, # see https://flutter.dev/custom-fonts/#from-packages
assets:- assets/img/sebas.jpg- assets/img/sebas2.jpg- assets/img/sebas3.jpg- assets/img/sebas4.jpgfonts:- family:Latofonts:- asset: fonts/Lato-Regular.ttf
Codigo de main
import'package:flutter/material.dart';import'description_place.dart';import'package:com/review.dart';import'package:com/review_list.dart';voidmain()=>runApp(MyApp());classMyAppextendsStatelessWidget{// This widget is the root of your application. @override
Widgetbuild(BuildContext context){returnMaterialApp(title:'Flutter Demo',theme:ThemeData(// This is the theme of your application.//// Try running your application with "flutter run". You'll see the// application has a blue toolbar. Then, without quitting the app, try// changing the primarySwatch below to Colors.green and then invoke// "hot reload" (press "r" in the console where you ran "flutter run",// or simply save your changes to "hot reload" in a Flutter IDE).// Notice that the counter didn't reset back to zero; the application// is not restarted.primarySwatch:Colors.blue,),home:Scaffold(appBar:AppBar(title:Text("EjemploApple"),),body:newColumn(children:<Widget>[DescriptionPlace("Bahamas",4,"dchjsdskldvjkljvkldfjvkldfjvkjflkvjdfkljvkldfjvkldfvkljdflkvdf""dfklvhdfkjvjdkfhvkjdfv""dvkjdfkvjdkflvcsjhdcsdgc"),Review("assets/img/sebas.jpg","SebastianPinos","1Comentario*5Fotos","Es un lugar maravilloso la Playa"),],),)//MyHomePage(title: 'Flutter Demo Home Page'),);}}
No parece haber nada mal, quizas tu carpeta se llame asset en vez de assets, o algo así, que la dirección esté mal.
el problema es la forma en la cual se declaro el directorio imagen en el documento .yaml, tuve ese mismo problema que no me reflejaba la imagen a si que registre el directorio de esta manera,
para posteriormente mandar a llamar la imagen,
saludos.-
Les deseo compartir un tip que me ha ayudado en los cursos de Platzi, específicamente en este curso de Fluttter: cuando haya algo que no entiendan o tengan preguntas, quizás en los videos siguientes se aclare. Eso es justo lo que me ha pasado con muchas preguntas que he tenido. Creo que les puede servir a todos en cualquier curso que realicen.
Saludos
Lo malo del curso es que todo es relacionado a Firebase ,pense ver otras alternativas como la carga de imagenes con Rest Api o Notificaciones pero no encuentro o yo estoy buscando mal
un truco para definir StatelessWidget y StateFullWidget en android studio usando
el plugin de dart,
simplemente escribiendo st nos muestra las opciones
queda de nuestra cuenta seleccionar el tipo de estado que queremos
para el caso del StateFullWidget simplemente escribimos el nombre de
nuestro widget y el lo completa
final userComment =Container(margin:EdgeInsets.only(left:20.0),child:Text( comment,textAlign:TextAlign.left,style:TextStyle(fontSize:13.0,fontFamily:"Lato",fontWeight:FontWeight.w900),),);final userInfo=Container(margin:EdgeInsets.only(left:20.0),child:Text( details,textAlign:TextAlign.left,style:TextStyle(fontSize:13.0,fontFamily:"Lato",color:Color(0xFFa3a5a7)),),);final userName =Container(margin:EdgeInsets.only(left:20.0),child:Text( name,textAlign:TextAlign.left,style:TextStyle(fontSize:17.0,fontFamily:"Lato"),),);final photo=Container(margin:EdgeInsets.only(top:20.0,left:20.0,),width:80.0,height:80.0,decoration:BoxDecoration(shape:BoxShape.circle,image:DecorationImage(fit:BoxFit.cover,image:NetworkImage(pathImage)),//AssetImage(pathImage))));final star=Container(margin:EdgeInsets.only(left:15.0,right:1.0),child:Icon(Icons.star,color:Color(0xFFF2C611),),width:1.0,); final userDetails =Column(crossAxisAlignment:CrossAxisAlignment.start,children:<Widget>[ userName,Row(children:<Widget>[ userInfo, star, star, star, star, star
],), userComment,],);returnRow(children:<Widget>[ photo, userDetails
],);
}
}
Hola estoy teniendo un problema que no me aparece la foto a la hora de compilar, no se si alguno me puede ayudar. Saludos.
ayuda.png
Si aparece una especie de "sombra cuadrada" donde debería estar la imagen puede ser porque en pubspec.yaml no están correctamente definidos los assets que utilizas. Tuve ese problema por la extensión del archivo (por ejemplo .jpg) estaba en mayúsculas cuando lo importé a la carpeta de assets/img y en la ruta lo ponía en minúsculas, o cosas así
En el siquiente video se termina de hacer el review de la app