android - Mostrar imagen A o B - Flutter

CorePress2024-01-25  7

¿Cómo puedo mostrar la Imagen A en la pantalla del usuario si es falsa o la Imagen B si es verdadera? La Imagen A es la primera que aparece, cuando el usuario hace clic en ella, el estado cambia a verdadero y cambia a Imagen. B, y cambia una vez que el usuario hace clic en él, el estado cambia a verdadero o falso. Imagen A = falsa Imagen B = verdadera

Imagen A - Imagen B

class _MyAppState extends State<MyApp> {

  bool closedImage = false;
  bool openImage = true;
  bool switchOn = false;

  void _onSwitchChanged(bool value) {
    setState(() {
      switchOn = false;
    });
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(scaffoldBackgroundColor: Colors.white),
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.white,
          elevation: 0,
        ),
        body: 
        Center(
          child: InkWell(
            onTap: () {
              Switch(
                onChanged: _onSwitchChanged,
                value: switchOn,
              );
            },
            child: Container(
              color: Colors.white,
              child: ClipRRect(
                child: switchOn ? Image.asset('lib/assets/closed.png') : Image.asset('lib/assets/open.png')
              )
            ),
          ),
        )
        ),
      );
  }
}


------------------------------------

Simplemente active la variable switchOn de esta manera:

void _onSwitchChanged(bool value) {
    setState(() {
      switchOn = !switchOn;
    });
  }

0



------------------------------------

Creo que su método _onSwitchChanged necesita usar el argumento de valor bool entrante (que proporciona el Switch).

Aquí hay un ejemplo similar que muestra el uso típico:

import 'package:flutter/material.dart';

class SwitchFieldPage extends StatefulWidget {
  @override
  _SwitchFieldPageState createState() => _SwitchFieldPageState();
}

class _SwitchFieldPageState extends State<SwitchFieldPage> {
  bool switchVal = false;
  String monkey = 'A';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Switch Field'),
      ),
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Text('Monkey $monkey'),
              Switch(
                onChanged: (val) { // ← remember to use val (bool)
                  print('Switch value: $val');
                  setState(() {
                    switchVal = val; // this sets the Switch setting on/off
                    monkey = val ? 'B' : 'A';  // change your monkey source
                  });

                },
                value: switchVal,
              )
            ],
          ),
        ),
      ),
    );
  }
}

2

Oye, ¿puedes ayudarme? He estado intentando durante 3 horas resolver este problema y hasta ahora no lo he logrado, ¿puedo subirlo a Github para que me ayudes? Es un proyecto para mi portafolio como Front-end, gracias.

- Germano Lira

28 de marzo de 2021 a las 4:01

Probé tu solución, funcionó, pero quería usar onTap en lugar de Switch, para evitar mostrar un botón

- Germano Lira

28 de marzo de 2021 a las 4:02



------------------------------------

Puedes utilizar GestureDetector o InkWell para detectar cuándo el usuario presiona la imagen. Para actualizar la imagen, sugeriría aprender a administrar el estado. Para simplificar esto por ahora, usaremos StreamBuilder.

pantalla.dart:

final ScreenBloc _screenBloc = ScreenBloc();

// This is inside your widget build
StreamBuilder<AuthState>(
          stream: _screenBloc.pic,
          initialData: false,
          builder: (context, snapshot) {
              return GestureDetector(
                 onTap: ()=> _screenBloc.toggle(),
                 child: snapshot.data?Image.asset('lib/assets/closed.png') : Image.asset('lib/assets/open.png'),
              );
          },
)

screen_bloc.dart:

class ScreenBloc{
 bool _currentState=false;
 StreamController<bool> _picStream = StreamController<bool>();
 Stream<bool> get pic => _picStream.stream;
 void toggle(){
  _currentState=!_currentState;
  _picStream.add(_currentState);
 }
}

1

1

Gracias, intentaré implementar y estudiar la gestión estatal

- Germano Lira

28 de marzo de 2021 a las 4:37

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare