4
respostas

Alguém pode me ajudar, como me comunicar e trazer informação de outro widget

Olá, fiz um projeto simples, está tudo funcionando até as funções, só não consigo trazer as informações. Se alguém souber uma forma mais simples para eu aprender, estou usando nesse projeto inherited.

MyAppPlanet.gif

main.dart

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'database/inherited_planet.dart';
import 'screen/initial_screen_planet.dart';

void main() {
  runApp(const MyAppPlanet());
}

class MyAppPlanet extends StatefulWidget {
  const MyAppPlanet({Key? key}) : super(key: key);

  @override
  State<MyAppPlanet> createState() => _MyAppPlanetState();
}

class _MyAppPlanetState extends State<MyAppPlanet> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Calculadora Peso-Planetas',
      theme: ThemeData(
        primarySwatch: Colors.grey,
        appBarTheme: const AppBarTheme(
          elevation: 0,
          backgroundColor: Colors.black,
          titleTextStyle: TextStyle(color: Colors.white),
        ),
        textTheme: GoogleFonts.bitterTextTheme(),
      ),
      darkTheme: ThemeData.dark(),
      themeMode: ThemeMode.light,
      home: InheritedPlanet(
          child: InitialScreenPlanet(taskPlanetContext: context)),
      //   //home: InheritedPlanet(child: MainScreenWight(taskPlanetContext: context)),
      // ),
    );
  }
}

initial_screen_planet.dart

import 'package:flutter/material.dart';
import '../database/inherited_planet.dart';
import 'main_screen_wight.dart';

class InitialScreenPlanet extends StatefulWidget {
  InitialScreenPlanet({Key? key, required BuildContext taskPlanetContext})
      : super(key: key);

  @override
  State<InitialScreenPlanet> createState() => _InitialScreenPlanetState();
}

class _InitialScreenPlanetState extends State<InitialScreenPlanet> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Planet Calculator', style: TextStyle(fontSize: 20)),
        //Botão para colocar seu peso
        actions: [
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: IconButton(
                onPressed: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (contextNew) => MainScreenWight(
                              taskPlanetContext: context,
                            )),
                  ).then((value) => setState(() {}));
                },
                icon: Icon(
                  Icons.add,
                  size: 30,
                  color: Colors.white,
                )),
          )
        ],
      ),
      body: Container(
        height: double.infinity,
        width: double.infinity,
        color: Colors.black,
        //color: Color.fromRGBO(137, 171, 184, 1),
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: ListView(
            children: InheritedPlanet.of(context).planetTaskFixa,
          ),
        ),
      ),
    );
  }
}
4 respostas

main_screen_wight.dart

import 'package:flutter/material.dart';
import '../database/inherited_planet.dart';

class MainScreenWight extends StatefulWidget {
  const MainScreenWight({Key? key, required this.taskPlanetContext})
      : super(key: key);

  // Criando um novo Context para importar a informação dessa página.
  final BuildContext taskPlanetContext;

  @override
  State<MainScreenWight> createState() => _MainScreenWightState();
}

class _MainScreenWightState extends State<MainScreenWight> {
  final _taskPlanetKey = GlobalKey<FormState>();

  // // bool para confirma se ele é Null ou Vazio.
  // bool valueValidator(String? value) {
  //   if (value != null && value.isEmpty) {
  //     return true;
  //   }
  //   return false;
  // }
  // bool para confirma se ele é Null ou Vazio e 1 a 5 Difficulty.
  bool difficultyValidator(String? value) {
    if (value != null && value.isEmpty) {
      if (int.parse(value) > 999 || int.parse(value) < 1) {
        return true;
      }
    }
    return false;
  }

  TextEditingController seuPesoController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _taskPlanetKey,
      child: Scaffold(
          body: Container(
        height: double.infinity,
        width: double.infinity,
        color: Colors.black,
        child: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(30.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                SizedBox(
                  height: 400,
                  width: 350,
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(10),
                    child: Image.asset(
                      'assets/images/planet/terra.jpg',
                      fit: BoxFit.cover,
                    ),
                  ),
                ),
                TextFormField(
                  validator: (value) {
                    // if (difficultyValidator(value)) {
                    //   return 'Insira uma Dificuldade entre 1 e 999';
                    // }
                    // return null;
                    if (value!.isEmpty ||
                        int.parse(value) > 999 ||
                        int.parse(value) < 1) {
                      return 'Insira um peso entre 1 á 999';
                    }
                    return null;
                  },
                  keyboardType: TextInputType.number,
                  controller: seuPesoController,
                  textAlign: TextAlign.center,
                  decoration: const InputDecoration(
                      hintText: 'Seu Peso?',
                      fillColor: Colors.white70,
                      filled: true),
                ),
                SizedBox(
                  height: 20,
                ),
                ElevatedButton(
                    onPressed: () {
                      if (_taskPlanetKey.currentState!.validate()) {
                        InheritedPlanet.of(widget.taskPlanetContext)
                            .newPlanetTaskPeso(
                          double.parse(seuPesoController.text),
                        );
                        print(int.parse(seuPesoController.text));

                        // Navigator.push(
                        //   context,
                        //   MaterialPageRoute(
                        //       builder: (contextNew) => InitialScreenPlanet(
                        //             taskPlanetContext: context,
                        //           )),
                        // ).then((value) => setState(() {}));

                        Navigator.pop(context);
                      }
                    },
                    child: const Text('Calcular'))
              ],
            ),
          ),
        ),
      )),
    );
  }
}

task_planet_two.dart

import 'package:flutter/material.dart';

class TaskPlanetTwo extends StatefulWidget {
  final String photoPlanet;
  final String namePlanet;
  final double? gravPlanet;
  double? pesoPlanetTerra = 9.8;
  late final double? pesoFinalN;
  late final double? pesoFinalKg;
  final double? seuPeso;
  final Function? taskPlanet;

  TaskPlanetTwo(
      {required this.photoPlanet,
      required this.namePlanet,
      this.gravPlanet,
      this.pesoPlanetTerra,
      Key? key,
      this.taskPlanet,
      this.pesoFinalN,
      this.seuPeso,
      this.pesoFinalKg})
      : super(key: key);

  @override
  State<TaskPlanetTwo> createState() => _TaskPlanetTwoState();
}

class _TaskPlanetTwoState extends State<TaskPlanetTwo> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Stack(
          children: [
            Column(
              children: [
                Container(
                  height: 250,
                  width: 380,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(20),
                    border: Border.all(color: Colors.white, width: 2),
                  ),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceAround,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Column(
                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: [
                          // FOTO DO PLANETA
                          Container(
                            height: 180,
                            width: 190,
                            child: ClipRRect(
                              child: Image.asset(
                                widget.photoPlanet,
                                fit: BoxFit.cover,
                              ),
                            ),
                            decoration: BoxDecoration(
                              borderRadius: BorderRadius.circular(10),
                            ),
                          ),
                          // NOME DO PLANETA
                          Container(
                            child: Text(
                              widget.namePlanet,
                              style:
                                  TextStyle(color: Colors.white, fontSize: 20),
                            ),
                          ),
                        ],
                      ),
                      //GRAVIDADE PLANETA
                      SizedBox(
                        height: 50,
                        width: 150,
                        child: Text(
                          strutStyle: StrutStyle(fontSize: 20),
                          'N:  \n'
                          'Kg: ',
                          style: TextStyle(color: Colors.white, fontSize: 21),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ],
        ),
      ],
    );
  }
}

task_planet.dart

import 'task_planet_two.dart';

class TaskPlanet {
  final TaskPlanetTwo planet;

  TaskPlanet({required this.planet});

  calcularPeso() {
    if (planet.pesoFinalKg != null && planet.pesoFinalN != null) {
      planet.pesoFinalN = (planet.seuPeso! * planet.gravPlanet!.toDouble());
      planet.pesoFinalKg =
          (planet.pesoFinalN! / planet.pesoPlanetTerra!.toDouble());
      print(planet.pesoFinalN);
      print(planet.pesoFinalKg);
      return true;
    }
    return false;
  }
}

inherited_planet.dart

import 'package:flutter/cupertino.dart';
import '../task/task_planet_two.dart';

class InheritedPlanet extends InheritedWidget {
  InheritedPlanet({
    Key? key,
    required Widget child,
  }) : super(key: key, child: child);

  final List<TaskPlanetTwo> planetTaskFixa = [
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/mercury.jpg',
      namePlanet: 'Mercury',
      gravPlanet: 3.6,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/venus.jpg',
      namePlanet: 'Vênus',
      gravPlanet: 8.7,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/moon.jpg',
      namePlanet: 'Lua',
      gravPlanet: 1.6,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/mars.jpg',
      namePlanet: 'Marte',
      gravPlanet: 3.7,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/jupiter.jpg',
      namePlanet: 'Júpiter',
      gravPlanet: 4.79,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/saturn.jpg',
      namePlanet: 'Saturno',
      gravPlanet: 10.44,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/uranus.jpg',
      namePlanet: 'Urano',
      gravPlanet: 8.69,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/neptune.jpg',
      namePlanet: 'Netuno',
      gravPlanet: 11.15,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/pluto.jpg',
      namePlanet: 'Plutão',
      gravPlanet: 0,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/io.jpg',
      namePlanet: 'Io',
      gravPlanet: 0.18,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/europa.jpg',
      namePlanet: 'Europa',
      gravPlanet: 0.13,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/ganymede.jpg',
      namePlanet: 'Ganymede',
      gravPlanet: 0.14,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/callisto.jpg',
      namePlanet: 'Callisto',
      gravPlanet: 0.12,
      //pesoPlanetTerra: 9.8,
    ),
    TaskPlanetTwo(
      photoPlanet: 'assets/images/planet/sun.jpg',
      namePlanet: 'Sol',
      gravPlanet: 27,
      //pesoPlanetTerra: 9.8,
    ),
  ];

  void newPlanetTaskPeso(double seuPeso) {
    planetTaskFixa.add(TaskPlanetTwo(
      seuPeso: seuPeso,
      photoPlanet: '',
      namePlanet: '',
    ));
  }

  static InheritedPlanet of(BuildContext context) {
    final InheritedPlanet? result =
        context.dependOnInheritedWidgetOfExactType<InheritedPlanet>();
    assert(result != null, 'No InheritedPlanet found in context');
    return result!;
  }

  @override
  bool updateShouldNotify(InheritedPlanet oldWidget) {
    return oldWidget.planetTaskFixa.length != planetTaskFixa.length;
  }
}

Olá, Daniel! Como vai?

Pelo que entendi, você está com dificuldades em trazer informações de outro widget no seu projeto. Uma forma de fazer isso é utilizando o conceito de "inherited widget" (widget herdado).

No seu código, você já está utilizando o InheritedPlanet para passar o contexto para o InitialScreenPlanet. Agora, para trazer as informações de outro widget, você pode acessar essas informações através do InheritedPlanet.of(context).

Por exemplo, se você quiser acessar a lista de tarefas do MainScreenWight no InitialScreenPlanet, você pode fazer assim:

InheritedPlanet.of(context).planetTaskFixa

Essa linha de código irá retornar a lista de tarefas do MainScreenWight. Você pode utilizar essa lista para exibir as informações que você precisa no InitialScreenPlanet.

Espero que isso te ajude a resolver o seu problema!

Um abraço e bons estudos.