Bienvenida e Introducción

1

¡Renovaremos este curso!

2

Desarrollando en Flutter

3

¿Qué es Flutter?

4

Dart y Flutter

5

Sintaxis de Dart

6

¡Renovaremos este curso!

7

Flutter para desarrolladores Android, iOS y Xamarin.forms

8

Flutter para desarrolladores React Native

9

¿Cómo luce una app construída en Flutter?

10

Primer reto

Creando mi entorno de desarrollo

11

¡Renovaremos este curso!

12

Requerimientos de Hardware y Software

13

Instalando Flutter en Android Studio y Visual Studio Code

14

Composición de un proyecto en Flutter

Interfaces en Flutter

15

¡Renovaremos este curso! Te quedan unos días para concluirlo.

16

Programación Declarativa en Flutter

17

Estructura de un programa en Flutter

18

Hola Mundo en Flutter

19

Widgets básicos

20

Widgets con estado y sin estado

21

Análisis de Interfaces de Usuario en Flutter

22

Definiendo los layouts de nuestra interfaz

23

Segundo reto

Widgets sin estado en Flutter

24

¡Renovaremos este curso! Te quedan unos días para concluirlo.

25

Flutter Widgets: Container, Text, Icon, Row

26

Flutter Widgets: Column

27

Recursos en Flutter: Tipografías y Google Fonts

28

Widget Image

29

Widget Apilando Textos

30

Widgets Decorados

31

Widget Imagen Decorada

32

Widget Listview

33

Widget Button, InkWell

34

Tercer reto

Widgets con estado en Flutter

35

¡Renovaremos este curso! Te quedan unos días para concluirlo.

36

Botones en Flutter

37

Clase StatefulWidget: Cómo se compone

38

Widget Floating Action Button

39

Widgets BottomNavigationBar

40

Generando Navegación en BottomNavigationBar

41

Personalizando nuestro BottomNavigation Bar a Cupertino iOS BottomBar

42

Cuarto reto

Fin del Curso

43

¡Renovaremos este curso!

44

Conclusiones

45

¡Terminamos!

Curso de Flutter

Curso de Flutter

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Cuarto reto

42/45

Lectura

Viene el gran reto, es momento de poner a prueba todo lo que has aprendido.
Analiza la siguiente interfaz, observa los widgets, colores, formas, mira que muchos de ellos los construímos durante el curso. Reutiliza todo lo necesario para construir la pantalla de Perfil de usuario, asígnala a su tap correspondiente y compártenos tus resultados en la sección de discusiones.

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 168

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

!! Reto Resuelto !!
GitHub: https://github.com/BrayanMamani/Trips

Resultado

profile_trips.dart

import 'package:app/card_image_detail.dart';
import 'package:app/gradient_back.dart';
import 'package:flutter/material.dart';

class ProfileTrips extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final detailProfile = Padding(
      padding: const EdgeInsets.only(left: 12, top: 85, right: 12),
      child: Row(
        children: <Widget>[
          Container(
            height: 85,
            width: 85,
            decoration: BoxDecoration(
                image: DecorationImage(image: AssetImage("assets/profile.jpg")),
                shape: BoxShape.circle,
                border: Border.all(width: 2.0, color: Colors.white)),
          ),
          Padding(
            padding: const EdgeInsets.only(left: 12),
            child: Text.rich(TextSpan(children: [
              TextSpan(
                  text: "Pablo Rafael\n",
                  style: TextStyle(
                      color: Colors.white, fontSize: 16, fontFamily: "Lato")),
              TextSpan(
                  text: "[email protected]",
                  style: TextStyle(
                      color: Colors.white24, fontSize: 16, fontFamily: "Lato"))
            ])),
          )
        ],
      ),
    );

    final widgetMenu = Padding(
      padding: const EdgeInsets.only(top: 16),
      child: Row(
        children: <Widget>[
          createIconButton(Icons.bookmark_border, mini: true, active: true),
          createIconButton(Icons.card_giftcard, mini: true),
          createIconButton(Icons.add, active: true),
          createIconButton(Icons.mail_outline, mini: true),
          createIconButton(Icons.person, mini: true)
        ],
      ),
    );

    return Stack(
      children: <Widget>[
        GradientBack(
          "Profile",
          heigth: 380,
        ),
        Positioned(
          child: Icon(
            Icons.settings,
            size: 15,
            color: Colors.white38,
          ),
          right: 20,
          top: 45,
        ),
        Column(
          children: <Widget>[detailProfile, widgetMenu],
        ),
        ListView(
          padding: EdgeInsets.only(left: 12, right: 12, top: 270),
          children: <Widget>[
            CardImageDetail(
                "Knuckles Mountains Range",
                "Elit ipsum ex nostrud laborum magna anim culpa velit voluptate eiusmod.",
                "assets/place_1.jpg",
                13000),
            CardImageDetail(
                "Knuckles Mountains Range",
                "Elit ipsum ex nostrud laborum magna anim culpa velit voluptate eiusmod incididunt.",
                "assets/place_2.jpg",
                13000),
          ],
        )
      ],
    );
  }

  Widget createIconButton(IconData iconData,
      {bool mini = false, bool active = false}) {
    return Expanded(
      flex: 1,
      child: Container(
        height: mini ? 35 : 60,
        width: mini ? 35 : 60,
        child: Center(
          child: Icon(
            iconData,
            color: Color(0xFF584CD1),
            size: mini ? 20 : 50,
          ),
        ),
        decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: active ? Colors.white : Colors.white54),
      ),
    );
  }
}

card_image_detail.dart

import 'package:flutter/material.dart';

class CardImageDetail extends StatelessWidget{

  final String title;
  final String detail;
  final String pathImage;
  final int steps;

  CardImageDetail(this.title, this.detail,this.pathImage, this.steps);

  @override
  Widget build(BuildContext context) {

    final cardImage = Container(
      height: 230,
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(pathImage),
          fit: BoxFit.cover,
        ),
        borderRadius: BorderRadius.circular(20),
        boxShadow: [
          BoxShadow(
            blurRadius: 16,
            color: Colors.black26,
            offset: Offset(0, 10)
          )
        ]
      ),
    );

    final cardDetail =  Container(
      width: double.maxFinite,
      margin: EdgeInsets.only(left: 45, right: 45, top: 170, bottom: 30),
      padding: EdgeInsets.all(16),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            blurRadius: 16,
            color: Colors.black26,
            offset: Offset(0, 10)
          )
        ],
        color: Colors.white
      ),
      child: Stack(
        alignment: Alignment(1.0, 2.0),
        children: <Widget>[
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text(
                title,
                style: TextStyle(
                  fontSize: 18,
                  fontWeight: FontWeight.bold
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(top: 8),
                child: Text(
                  detail,
                  style: TextStyle(
                    color: Colors.black45
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(top: 8),
                child: Text(
                  "Steps $steps",
                  style: TextStyle(
                    fontSize: 17,
                    color: Color.fromRGBO(232, 166, 90, 1),
                    fontWeight: FontWeight.bold,
                  ),
                ),
              )
            ],
          ),
          FloatingActionButton(
            onPressed: null, 
            mini: true, 
            child: Icon(Icons.favorite), 
            backgroundColor: Color.fromRGBO(102, 216, 105, 1)
          )
        ],
      ),
    );

    return Container(
      child: Stack(
        children: <Widget>[
          cardImage,
          cardDetail
        ],
      ),
    );
  }
}

Muchísimas gracias :3

Este es mi versión del reto.
Por si les interesa, para darle formato al número de pasos utilicé la librería intl.

import 'package:intl/intl.dart';

NumberFormat _formatter = NumberFormat("###,###");
String formattedSteps = _formatter.format(steps);```

Como se ve 😀

😁

Un Poco de Código

Aún por afinar algunas cositas

Anexo Código por si necesitas ayuda
GitHub

Por fin:

profile_trips.dart

import 'package:flutter/material.dart';
import 'package:platzi_trips_app/gradient_back.dart';
import 'package:platzi_trips_app/card_photo_detail.dart';


class ProfileTrips extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final detailProfile = Padding(
      padding: const EdgeInsets.only(
        left: 12,
        top: 85,
        right: 12
      ),
      child: Row(
        children: <Widget>[
          Container(
            height: 85,
            width: 85,
            decoration: BoxDecoration(
              image: DecorationImage(
                image: AssetImage("assets/img/traveller.jpg"),
              ),
              shape: BoxShape.circle,
              border: Border.all(
                width: 2,
                color: Colors.white
              )
            ),
          ),
          Padding(
            padding: const EdgeInsets.only(left: 12, right: 15),
            child: Text.rich(TextSpan(children: [
                TextSpan(
                  text: "Anita la Huerfanita\n",
                  style: TextStyle(color: Colors.white, fontSize: 16, fontFamily: "Lato"
                  )
                ),
                TextSpan(
                  text: "[email protected]",
                  style: TextStyle(
                    color: Colors.white24, fontSize: 16, fontFamily: "Lato")
                )
              ]
            )),
          )
        ],
      ),
    );

    Widget CreateIconButton(IconData iconData,
        {bool mini = false, bool active = false}) {
      return Expanded(
        flex: 1,
        child: Container(
          height: mini ? 35 : 55,
          width: mini ? 35 : 55,
          child: Center(
            child: Icon(
              iconData,
              color: Color(0xFF584CD1),
              size: mini ? 20 : 45,
            ),
          ),
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: active ? Colors.white : Colors.white54
          ),
        ),
      );
    }

    final widgetMenu = Padding(
      padding: const EdgeInsets.only(
          top: 16
      ),
      child: Row(
        children: <Widget>[
          CreateIconButton(Icons.bookmark_border, mini: true, active: true),
          CreateIconButton(Icons.card_giftcard, mini: true),
          CreateIconButton(Icons.add, active: true),
          CreateIconButton(Icons.mail_outline, mini: true),
          CreateIconButton(Icons.person, mini: true),
        ],
      ),
    );

    return Stack(
      children: <Widget>[
        GradientBack(
          "Profile",
          255
        ),
        Positioned(
          child: Icon(
            Icons.settings,
            size: 15,
            color: Colors.white38,
          ),
          right: 20,
            top: 45,
        ),
        Column(
          children: <Widget>[
            detailProfile,
            widgetMenu
          ],
        ),
        ListView(
          padding: EdgeInsets.only(
            left: 12,
            right: 12,
            top: 270
          ),
          children: <Widget>[
            CardPhotoDetail(
              "Knuckles Mountains Range",
              "Elit ipsum ex laborum magna anim culpa velit volutuos",
              110000006,
              "assets/img/mountain.jpeg",
            ),
            CardPhotoDetail(
              "Cabo Beach",
              "Elit ipsum ex laborum magna anim culpa velit volutuos",
              120000006,
              "assets/img/beach1.jpg",
            ),
            CardPhotoDetail(
              "River Falls Plate",
              "Elit ipsum ex laborum magna anim culpa velit volutuos",
              130000006,
              "assets/img/river.jpg",
            ),
          ],
        )
      ],
    );
  }
}

card_photo_datail.dart

import 'package:flutter/material.dart';

class CardPhotoDetail extends StatelessWidget {

  String title = "knuckles Mountains Range";
  String detail = "Hiking, Water fall hunting, Natural bath, Scenery & Photography";
  int steps = 123123123;
  String pathImage = "assets/img/beach.jpg";

  CardPhotoDetail(this.title, this.detail, this.steps, this.pathImage);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    final cardImage = Container(
      height: 230,
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage(pathImage),
          fit: BoxFit.cover
        ),
        borderRadius: BorderRadius.circular(10),
        boxShadow: [
          BoxShadow(
            blurRadius: 16,
            color: Colors.black26,
            offset: Offset(0, 10)
          )
        ]
      ),
    );

    final cardDetail = Container(
      width: double.maxFinite,
      margin: EdgeInsets.only(
        left: 45,
        right: 45,
        top: 170,
        bottom: 30
      ),
      padding: EdgeInsets.all(16),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            blurRadius: 16,
            color: Colors.black26,
            offset: Offset(0, 10)
          )
        ],
        color: Colors.white
      ),
      child: Stack(
        alignment: Alignment(1, 2),
        children: <Widget>[
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text(
                title,
                style: TextStyle(
                  fontSize: 18,
                  fontWeight: FontWeight.bold,
                  fontFamily: "Lato"
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(
                  top: 8
                ),
                child: Text(
                  detail,
                  style: TextStyle(
                    color: Colors.black45,
                    fontFamily: "Lato"
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(
                  top: 8
                ),
                child: Text(
                  "Steps:  $steps",
                  style: TextStyle(
                    fontSize: 17,
                    color: Color.fromRGBO(232, 166, 90, 1),
                    fontWeight: FontWeight.bold,
                    fontFamily: "Lato"
                  ),
                ),
              )
            ],
          ),
          FloatingActionButton(
            onPressed: null,
            mini: true,
            child: Icon(Icons.favorite),
            backgroundColor: Color.fromRGBO(102, 216, 105, 1)
          )
        ],
      ),
    );

   return Container(
    child: Stack(
      children: <Widget>[
        cardImage,
        cardDetail
      ],
    ),
   );
  }
}

Con detallitos pero salió…

Mi solución:

/** profile_trips.dart **/
import 'package:flutter/material.dart';
import 'profile_abbpar.dart';
import 'profile_places_list.dart';
class ProfileTrips extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Stack(
      children: <Widget>[
        ProfileAppBar("Profile"),
        ProfilePlacesList()
      ],
    );
  }
}
/** profile_appbar.dart **/
import 'package:flutter/material.dart';

class ProfileAppBar extends StatelessWidget{
  String title = "Popular";
  ProfileAppBar(this.title);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    final profileTitle = Container(
      margin: EdgeInsets.only(
        top: 37.0,
        left: 30.0
      ),
      child: Row(
        children: <Widget>[
          Expanded(
            child: Container(
              child: Text(
                title,
                style: TextStyle(
                  color: Colors.white,
                  fontWeight: FontWeight.w900,
                  fontFamily: "Lato",
                  fontSize: 30.0,
                ),
                textAlign: TextAlign.left,
              ),
            ),
          ),
          Container(
            margin: EdgeInsets.only(
                right: 20.0,
                top: 40.0
            ),
            child: Icon(
                Icons.settings,
                color: Color.fromRGBO(255, 255, 255, 0.5),
                size: 17.0
            ),
          )
        ],
      ),
    );

    final profilePicture = Container(
      margin: EdgeInsets.only(
        right: 20.0
      ),
      width: 77,
      height: 77,
      decoration: BoxDecoration(
        border: Border.all(
          color: Colors.white,
          width: 2.5
        ),
        shape: BoxShape.circle,
        color: Colors.white,
        image: DecorationImage(
          fit: BoxFit.cover,
          image: AssetImage("assets/images/profilepicture.png"),
        )
      ),
    );

    final profileInfo = Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Text(
          "Pathum Tzoo",
          style: TextStyle(
            color: Colors.white,
            fontSize: 17.33
          ),
        ),
        Text(
          "[email protected]",
          style: TextStyle(
            color: Color.fromRGBO(255, 255, 255, 0.32),
            fontSize: 13.19
          ),
        )
      ],
    );


    final profileName = Container(
      margin: EdgeInsets.only(
        top: 10.0,
        left: 30.0
      ),
      child: Row(
        children: <Widget>[
          profilePicture,
          profileInfo
        ],
      ),
    );

    final profileActionButtons = InkWell(
      child: Container(
          margin: EdgeInsets.only(
              top: 20.0,
              left: 15.0,
              right: 15.0
          ),
          child: Row(
            children: <Widget>[
              Expanded(
                child: Container(
                  width: 31,
                  height: 31,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color.fromRGBO(255, 255, 255, 1),
                  ),
                  child: Icon(
                      Icons.bookmark_border,
                      size: 17.0,
                      color: Color.fromRGBO(66, 104, 211, 1)
                  ),
                ),
              ),
              Expanded(
                child: Container(
                  width: 31,
                  height: 31,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color.fromRGBO(255, 255, 255, 1),
                  ),
                  child: Icon(
                      Icons.calendar_today,
                      size: 17.0,
                      color: Color.fromRGBO(66, 104, 211, 1)
                  ),
                ),
              ),
              Expanded(
                child: Container(
                  width: 51,
                  height: 51,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color.fromRGBO(255, 255, 255, 1),
                  ),
                  child: Icon(
                      Icons.add,
                      size: 34.0,
                      color: Color.fromRGBO(66, 104, 211, 1)
                  ),
                ),
              ),
              Expanded(
                child: Container(
                  width: 31,
                  height: 31,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color.fromRGBO(255, 255, 255, 1),
                  ),
                  child: Icon(
                      Icons.email,
                      size: 17.0,
                      color: Color.fromRGBO(66, 104, 211, 1)
                  ),
                ),
              ),
              Expanded(
                child: Container(
                  width: 31,
                  height: 31,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color.fromRGBO(255, 255, 255, 1),
                  ),
                  child: Icon(
                      Icons.person,
                      size: 17.0,
                      color: Color.fromRGBO(66, 104, 211, 1)
                  ),
                ),
              ),
            ],
          )
      )
    );
    

    return Container(
      height: 374.0,
      decoration: BoxDecoration(
        image: DecorationImage(
          fit: BoxFit.cover,
          image: AssetImage(
            "assets/images/appbarprofile.png"
          )
        )
      ),
      child: Column(
        children: <Widget>[
          profileTitle,
          profileName,
          profileActionButtons
        ],
      )
    );
  }
}
/** profile_places_list.dart **/
import 'package:flutter/material.dart';
import 'profile_places.dart';

class ProfilePlacesList extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      margin: EdgeInsets.only(
          top: 280
      ),
      child: ListView(
        children: <Widget>[
          ProfilePlaces(
            "assets/images/sisal-01.jpg",
            "Paraíso Sisal","Hermosas playas ubicadas en el \nhermoso estado de Yucatán",
            "Distancia 64 kms."
          ),
          ProfilePlaces(
              "assets/images/beach_palm.jpeg",
              "Puerto Progreso","Hermosas playas ubicadas en el \nhermoso estado de Yucatán",
              "Distancia 32 kms."
          ),
          ProfilePlaces(
              "assets/images/mountain.jpeg",
              "Nevado de Toluca","Ubicadas en el estado de Toluca a mas de 3000 km de altura",
              "Distancia 3000 kms."
          ),
          ProfilePlaces(
              "assets/images/river.jpeg",
              "Cañon del Sumidero","Ubicado en el estado de Chiapas, \nconsiderado patrimonio de la humanidad.",
              "Distancia 1560 kms."
          ),
        ],
      )
    );
  }
}
/** profile_places.dart **/
import 'package:flutter/material.dart';

class ProfilePlaces extends StatelessWidget{
  String imagePath = "assets/images/sisal-01.jpg";
  String placeName = "Paraíso Sisal";
  String placeDescription = "Hermosas playas ubicadas en el \n"
                            "hermoso estado de Yucatán";
  String placeDistance = "Distancia 64 kms.";

  ProfilePlaces(this.imagePath, this.placeName, this.placeDescription, this.placeDistance);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    final imageCard = Container(
      height: 211.0,
      margin: EdgeInsets.only(
        left: 15.0,
        right: 15,
      ),
      decoration: BoxDecoration(
        color: Colors.red,
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(20),
        image: DecorationImage(
          fit: BoxFit.cover,
          image: AssetImage(imagePath)
        ),
        boxShadow: <BoxShadow>[
          BoxShadow(
              color: Colors.black38,
              blurRadius: 15.0,
              offset: Offset(0.0, 7.0)
          )
        ]
      )
    );

    final imageCardText = Container(
      height: 98.883,
      width: 251,
      decoration: BoxDecoration(
        color: Colors.white,
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(15),
        boxShadow: <BoxShadow>[
          BoxShadow(
              color: Colors.black38,
              blurRadius: 15.0,
              offset: Offset(0.0, 7.0)
          )
        ],
      ),
      child: Container(
        margin: EdgeInsets.only(
          left: 20,
          top: 15,
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: Text(
                placeName,
                style: TextStyle(
                  color: Color(0xFF231F20),
                  fontWeight: FontWeight.w900,
                  fontSize: 16.23,
                ),
              ),
            ),
            Expanded(
              child: Text(
                placeDescription,
                style: TextStyle(
                    color: Color(0xFF808285),
                    fontSize: 9,
                    fontWeight: FontWeight.w100
                ),
              ),
            ),
            Expanded(
              child: Text(
                placeDistance,
                style: TextStyle(
                    color: Color(0xFFF7941E),
                    fontSize: 12,
                    fontWeight: FontWeight.w500
                ),
              ),
            ),

          ],
        ),
      ),
    );

    return Container(
      margin: EdgeInsets.only(bottom: 100),
      child: Stack(
        alignment: Alignment(0, 1.8),
        children: <Widget>[
          imageCard,
          imageCardText
        ],
      )
    );
  }
}```


Me costó mucho acostumbrarme a generar la vista, pero ya le pillé la gracia. Muy entretenido Flutter

Reto Cumplido Papu!!!

Me costo bastante, pero al final lo termine ❤️

import 'package:flutter/material.dart';
import 'profile_places.dart';
import 'header_profile.dart';

class ProfileTrips extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        Container(
          height: 350.0,
          decoration: BoxDecoration(
              gradient: LinearGradient(
                  colors: [Color(0xFF4268D3), Color(0xFF584CD1)],
                  begin: FractionalOffset(0.2, 0.0),
                  end: FractionalOffset(1.0, 0.6),
                  stops: [0.0, 0.6],
                  tileMode: TileMode.clamp)),
          alignment: Alignment(-0.9, -0.6),
        ),
        ProfilePlaces()
      ],
    );
  }
}```




`import ‘package:flutter/material.dart’;
import ‘package:flutter/cupertino.dart’;

import ‘floating_action_button_green.dart’;

class ProfileReview extends StatelessWidget {
String pathImage = “assets/bahamas1.jpeg”;
String placeName;
String placeDescription;
String placeSteps;
ProfileReview(
this.pathImage, this.placeDescription, this.placeName, this.placeSteps);

@override
Widget build(BuildContext context) {
final card = Container(
height: 200.0,
width: 380.0,
margin: EdgeInsets.only(top: 20.0, bottom: 40.0, right: 10.0, left: 10.0),
decoration: BoxDecoration(
image:
DecorationImage(fit: BoxFit.cover, image: AssetImage(pathImage)),
borderRadius: BorderRadius.all(Radius.circular(10.0)),
shape: BoxShape.rectangle,
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.black38,
blurRadius: 15.0,
offset: Offset(0.0, 7.0))
]),
);

final place = Container(
  height: 100.0,
  width: 300.0,
  margin: EdgeInsets.only(
    top: 20.0,
    bottom: 40.0,
  ),
  decoration: BoxDecoration(
      color: Colors.white,
      borderRadius: BorderRadius.all(Radius.circular(10.0)),
      shape: BoxShape.rectangle,
      boxShadow: <BoxShadow>[
        BoxShadow(
            color: Colors.black38,
            blurRadius: 15.0,
            offset: Offset(0.0, 7.0))
      ]),
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Container(
        padding: EdgeInsets.only(
          top: 10.0,
          left: 10.0,
        ),
        child: Text(
          placeName,
          style: TextStyle(fontWeight: FontWeight.bold, fontSize: 25),
        ),
      ),
      Container(
        width: 230,
        padding: EdgeInsets.only(top: 5.0, left: 10.0),
        child: Text(
          placeDescription,
          style: TextStyle(fontSize: 14, color: Colors.black38),
        ),
      ),
      Container(
        padding: EdgeInsets.only(top: 5.0, left: 10.0),
        child: Text(
          placeSteps,
          style: TextStyle(fontSize: 14, color: Colors.deepOrange),
        ),
      )
    ],
  ),
);

final cardPlace = Stack(
  alignment: Alignment(0, 1.5),
  children: [card, place],
);

return Stack(
  alignment: Alignment(0.6, 0.9),
  children: [cardPlace, FloatingActionButtonGreen()],
);

}
}




```
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'profile_review.dart';
import 'profile_header.dart';

class ProfilePlaces extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 650.0,
      child: ListView(
        padding: EdgeInsets.all(5.0),
        children: [
          ProfileHeader("Cristhian Pérez E.", "[email protected]",
              "assets/img/camilo.jpg", "Profile"),
          ProfileReview(
              "assets/img/niagara.jpg",
              "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
              "Cataratas del Niagara",
              "Steps: 234234"),
          ProfileReview(
              "assets/img/nevadoruiz.jpeg",
              "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
              "Nevado del Ruiz",
              "Steps: 45764"),
          ProfileReview(
              "assets/img/santamarta.jpg",
              "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
              "Santa Marta",
              "Steps: 198789"),
        ],
      ),
    );
  }
}
```



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

class ProfileHeader extends StatelessWidget {
  String usName = "Usuario";
  String usMail = "[email protected]";
  String photoPath = "assets/mount.jpg";
  String title = "Profile";

  ProfileHeader(this.usName, this.usMail, this.photoPath, this.title);
  @override
  Widget build(BuildContext context) {
    final userName = Container(
      margin: EdgeInsets.only(
        left: 20.0,
      ),
      child: Text(
        usName,
        textAlign: TextAlign.left,
        style: TextStyle(
            color: Colors.white,
            fontFamily: "Lato",
            fontSize: 20.0,
            fontWeight: FontWeight.w900),
      ),
    );

    final userMail = Container(
      margin: EdgeInsets.only(
        left: 20.0,
      ),
      child: Text(
        usMail,
        textAlign: TextAlign.left,
        style: TextStyle(
            color: Colors.white54,
            fontFamily: "Lato",
            fontSize: 13.0,
            fontWeight: FontWeight.w900),
      ),
    );

    final userData = Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [userName, userMail],
    );

    final userPhoto = 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(photoPath),
          )),
    );

    return Container(
      child: Column(
        children: [
          Row(
            children: [
              Container(
                padding: EdgeInsets.only(
                  top: 20.0,
                  left: 20.0,
                ),
                width: 320,
                alignment: Alignment.bottomLeft,
                child: Text(
                  title,
                  style: TextStyle(
                      color: Colors.white,
                      fontSize: 30.0,
                      fontFamily: "Lato",
                      fontWeight: FontWeight.bold),
                ),
              ),
              Container(
                alignment: Alignment.bottomRight,
                padding: EdgeInsets.only(
                  top: 20.0,
                ),
                child: Icon(Icons.settings, color: Colors.white),
              )
            ],
          ),
          Row(
            children: [userPhoto, userData],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              Container(
                width: 50,
                height: 40,
                margin: EdgeInsets.only(
                  left: 20.0,
                  top: 20.0,
                ),
                decoration:
                    BoxDecoration(shape: BoxShape.circle, color: Colors.white),
                child: Icon(
                  Icons.bookmark_border,
                  color: Colors.indigo,
                ),
              ),
              Container(
                width: 50,
                height: 40,
                margin: EdgeInsets.only(
                  left: 20.0,
                  top: 20.0,
                ),
                decoration:
                    BoxDecoration(shape: BoxShape.circle, color: Colors.white),
                child: Icon(
                  Icons.card_giftcard,
                  color: Colors.indigo,
                ),
              ),
              Container(
                width: 70,
                height: 70,
                margin: EdgeInsets.only(
                  left: 20.0,
                  top: 20.0,
                ),
                decoration:
                    BoxDecoration(shape: BoxShape.circle, color: Colors.white),
                child: Icon(
                  Icons.add,
                  color: Colors.indigo,
                ),
              ),
              Container(
                width: 50,
                height: 40,
                margin: EdgeInsets.only(
                  left: 20.0,
                  top: 20.0,
                ),
                decoration:
                    BoxDecoration(shape: BoxShape.circle, color: Colors.white),
                child: Icon(
                  Icons.mail,
                  color: Colors.indigo,
                ),
              ),
              Container(
                width: 50,
                height: 40,
                margin: EdgeInsets.only(
                  left: 20.0,
                  top: 20.0,
                ),
                decoration:
                    BoxDecoration(shape: BoxShape.circle, color: Colors.white),
                child: Icon(
                  Icons.person,
                  color: Colors.indigo,
                ),
              )
            ],
          )
        ],
      ),
    );
  }
}
```

Con algunas cosas que no quedaron exactamente igual, pero creo que me acerque bastante! , de igual forma aproveche para llenar la pantalla de search jajaja
saludos!

¡Reto Cumplido! Me tarde poquito pero si salio.

Reto cumplido ! 😄 😄 😄

Finalizado cuarto reto.

Reto finalizado!

Reto 4 Superado : D

Al fin, reto terminado.

Creo que la parte que más se me complico fue la del gradiente de fondo pero lo resolví de la siguiente manera.

class GradientBackTwo extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container(
      height: 390.0,
      decoration: BoxDecoration(
        gradient: RadialGradient(
          colors: [
            Color(0xff584cd1),
            Color(0xff5461CC),
            Color(0xff516CCD),
            Color(0xff4268d3),
          ],
          radius: 4.5,
          stops: [0.1, 0.2, 0.21, 0.5],
          center: Alignment(1.3, 0.85),
          focalRadius: 1,
        ),
      ),
    );
  }
}```

A seguir avanzando!
.

.
.

Reto completado
MI resultado gracias a la ayuda del curso y de los y las participantes:

import 'package:flutter/material.dart';
import 'package:prueba/card_profile.dart';
import 'package:prueba/photo_profile.dart';
import 'title_profile.dart';
import 'gradient_back.dart';
import 'name_profile.dart';
import 'circle_bar.dart';
import 'card_profile_list.dart';

class ProfileTrips extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Stack(children: <Widget>[
      GradientBack('Profike'),
      TitleProfile('Profile'),
      ListView(
        children: <Widget>[NameProfile()],
      ),
      CircleBar(),
      CardProfileList()
    ]);
  }
}

Logre terminar el reto, cada boton puede cambiar de opacidad si se le hizo click , tambien el list view puede ocultarse por debajo del appbar sin dejar de estar sobrepuesto al mismo.
Me gustaria compartir el codigo pero aun no se como mostrarlo en github.

import 'package:flutter/material.dart';

class ProfileButtomsAppBar extends StatefulWidget {
  @override
  _ProfileButtomsAppBar createState() => _ProfileButtomsAppBar();
}

class _ProfileButtomsAppBar extends State<ProfileButtomsAppBar> {
  List<double> _opacity = [0.5, 0.5, 0.5, 0.5, 0.5];

  void _OpacityClick(int number) {
    setState(() {
      _opacity[number] = _opacity[number] == 0.5 ? 1.0 : 0.5;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Expanded(
            child: Container(
          height: 44,
          alignment: Alignment.centerLeft,
          child: InkWell(
              onTap: (() => _OpacityClick(0)),
              child: Opacity(
                opacity: _opacity[0],
                child: Container(
                  height: 35,
                  width: 35,
                  decoration: BoxDecoration(
                      shape: BoxShape.circle, color: Colors.white),
                  child: Icon(
                    Icons.bookmark_border,
                    color: Color(0xFF584CD1),
                    size: 25,
                  ),
                ),
              )),
        )),
        Expanded(
            child: Container(
                height: 44,
                alignment: Alignment.centerLeft,
                child: InkWell(
                    onTap: () => _OpacityClick(1),
                    child: Opacity(
                      opacity: _opacity[1],
                      child: Container(
                        height: 35,
                        width: 35,
                        decoration: BoxDecoration(
                            shape: BoxShape.circle, color: Colors.white),
                        child: Icon(
                          Icons.screenshot_monitor_outlined,
                          color: Color(0xFF584CD1),
                          size: 25,
                        ),
                      ),
                    )))),
        Expanded(
            child: Container(
                height: 55,
                child: InkWell(
                    onTap: () => _OpacityClick(2),
                    child: Opacity(
                      opacity: _opacity[2],
                      child: Container(
                        height: 55,
                        width: 55,
                        decoration: BoxDecoration(
                            shape: BoxShape.circle, color: Colors.white),
                        child: Icon(
                          Icons.add,
                          color: Color(0xFF584CD1),
                          size: 51,
                        ),
                      ),
                    )))),
        Expanded(
          child: Container(
              alignment: Alignment.centerRight,
              height: 44,
              child: InkWell(
                  onTap: () => _OpacityClick(3),
                  child: Opacity(
                    opacity: _opacity[3],
                    child: Container(
                      height: 35,
                      width: 35,
                      decoration: BoxDecoration(
                          shape: BoxShape.circle, color: Colors.white),
                      child: Icon(
                        Icons.email_outlined,
                        color: Color(0xFF584CD1),
                        size: 25,
                      ),
                    ),
                  ))),
        ),
        Expanded(
            child: Container(
                height: 44,
                alignment: Alignment.centerRight,
                child: InkWell(
                    onTap: () => _OpacityClick(4),
                    child: Opacity(
                      opacity: _opacity[4],
                      child: Container(
                        height: 35,
                        width: 35,
                        decoration: BoxDecoration(
                            shape: BoxShape.circle, color: Colors.white),
                        child: Icon(
                          Icons.person,
                          color: Color(0xFF584CD1),
                          size: 25,
                        ),
                      ),
                    )))),
      ],
    );
  }
}

Reto realizado.

Reto Terminado

Para los que quieran hacer bonitos degradados sin romperse la cabeza me imaginé que existen gradientes para flutter como los hay para css se los dejo por aquí:
https://fluttergradientgenerator.com/

Comparto mi solución al reto 4.

Saludos compañeros 😄
Les comparto mi reto finalizado:
https://github.com/JoaquinMX/PlatziFavoritePlacesByJoaquinMX

Muy buen reto…

Reto completado
Codigo en git: https://github.com/Darynka-Tapia/flutter_app

![](

Reto cumplido

![](

Cuarto reto!

Reto cumplido

El gradiente lo cree con Path, aunque no se si existe algo mejor

Reto realizado

Reto Realizado !

¡¡Reto terminado!!

Aqui mi repositorio

No me quedo chido, pero ahí voy 😮 😛

Espero que con la practica me vaya saliendo mejor 😄

Reto realizado (2021)

Reto completado!!! 😄

Reto cumplido 😄

Completado!

Mi resultado final

Reto completado, después de dos dias… : )

Reto completado:

Excelente!! Me encantó este framework. Una belleza!!
Dejo el código en Github.
Aquí debajo una captura de como quedó.

SHAFICK ISRAEL

La curva transparente en el background gradient me hizo falta

Listo, aveces me falla el boton de Fav no se porque y deja de de funcionar completamete si lo envio a la esquina inferior izquierda

Quedo bien creo yo 😄

Mas o menos :b

Terminado!

😃 More!

Reto completado! Comparto captura 😉

Lo logre, aquí el resultado:

El Reto

Reto cumplido 😄 … again

¡Cuarto reto!

Reto completado
Repo Github

Reto cuatro cumplido

¡Por fin!
GitHub

Gracias Ann por tan buen curso !

Hice en 4/5 horas lo que en nativo me hubiera llevado todo el día. Aunque también ayudó tener widgets y estilos hechos (las sombras y el fab de like).

Me queda la duda de como generar el aspecto circular en el gradiente del header 🤔🤔.

Reto listo! Github repo

😃 me tomo algo de tiempo, pero estoy feliz con el resultado

¡Reto cumplido!
GitHub

Reto complido

¡Hola a todos!

Por fin pude completar el reto. Gracias @anncode, aprendí muchísimo.

Les dejo mi propuesta del reto:

Listo!