1
resposta

[Dúvida] Resetando os níveis ao scrollar a tela.

O código todo está rodando certinho, porém ao scrollar a tela, os níveis setados voltam a 0. Já fiz o que recomendaram em uma duvida igual a minha, porém não funcionou. Meu código está assim:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.lightBlue,
          title: Text(
            'Lista de Tarefas',
            style: TextStyle(fontSize: 30),
          ),
        ),
        body: ListView(
          children: [
            Task('Aprender Flutter'),
            Task('Meditar'),
            Task('Andar de bike'),
            Task('Pescar'),
            Task('Ajudar Idosos'),
            Task('Ir para a igreja'),
            Task('Correr'),
            Task('Estudar React'),
            Task('Estudar Cybersecurity'),
            Task('Passear com as cachorras'),
          ],
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {},
        ),
      ),
    );
  }
}

class Task extends StatefulWidget {
  final String nome;

  const Task(this.nome, {super.key});

  @override
  State<Task> createState() => _TaskState();
}

class _TaskState extends State<Task> {
  int nivel = 0;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Container(
        child: Stack(
          children: [
            Container(
              color: Colors.blue,
              width: 400,
              height: 140,
            ),
            Column(
              children: [
                Container(
                  color: Colors.white,
                  width: 380,
                  height: 100,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Container(
                        color: Colors.black12,
                        width: 80,
                        height: 100,
                      ),
                      Container(
                          alignment: Alignment.center,
                          width: 180,
                          child: Text(widget.nome,
                              style: TextStyle(
                                fontSize: 20,
                                overflow: TextOverflow.ellipsis,
                              ))),
                      ElevatedButton(
                        onPressed: () {
                          setState(() {
                            nivel++;
                          });
                          print(nivel);
                        },
                        child: Icon(Icons.arrow_drop_up),
                      )
                    ],
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Container(
                        child: LinearProgressIndicator(
                          color: Colors.white,
                          value: nivel/10 ,
                        ),
                        width: 200,
                      ),
                      Text(
                        'Nivel $nivel',
                        style: TextStyle(color: Colors.white, fontSize: 16),
                      ),
                    ],
                  ),
                )
              ],
            )
          ],
        ),
      ),
    );
  }
}
1 resposta

Olá, Caio, tudo bem?

Parece que o problema dos níveis resetando ao scrollar está relacionado ao fato de que os widgets são reconstruídos quando saem e voltam à tela em uma ListView. Como cada item da lista está dentro de um widget Task, toda vez que a lista rola, o widget é reconstruído, e a variável nivel volta para 0.

Você conseguiria resolver isso seria utilizando um gerenciamento de estado mais persistente, como o Provider ou o setState de uma maneira que o estado não seja perdido. Outra alternativa seria manter o nível em uma estrutura de dados que não se perca com a reconstrução, como uma lista fora do widget. Por exemplo, utilizando List para armazenar os níveis, assim eles não se perderiam ao scrollar.

Espero que tenha ajudado. Qualquer dúvida, o fórum está à disposição!

Um abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!