Не работает функция Flutter _scaffoldKey.currentState.openDrawer()

#android #flutter #drawer

#Android #трепетание #выдвижной ящик

Вопрос:

У меня следующая проблема: у меня есть основной класс, который показывает мне изображение, вызывающее ящик. Пока это работает нормально, но когда я вызываю другой класс в теле (CardApplications), ящик не работает. Я до сих пор не знаю, как это исправить. Когда я не вызываю класс «CrearAplicaciones», ящик вызывается правильно с помощью _scaffoldKey, но если я вызываю его, абсолютно ничего не происходит, даже ошибки.

 class HomeUsuario extends StatefulWidget {
  final StorageClass storage;
  HomeUsuario({Key key, @required this.storage}) : super(key: key);

  @override
  HomeUsuarioState createState() => HomeUsuarioState();
}

class HomeUsuarioState extends State<HomeUsuario> {
  final prefs = PreferenciasUsuario();
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  Application app;

  @override
  // guardo en el documento global la información del usuario.
  void initState() {
    widget.storage.writeData(
        '["${prefs.codigo}","${prefs.ciudad}","${prefs.oficina}","${prefs.seccion}"]');
    widget.storage.readData();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return Scaffold(
      key: _scaffoldKey,
      drawer: MenuWidget(),
      body: Stack(
        children: [
          Padding(
            padding:  EdgeInsets.only(left: size.width*0.7,top: size.height*0.1),
            child: InkWell(
              onTap: () => _scaffoldKey.currentState.openDrawer(),
              child: Container(
                child: ClipRRect(
                  borderRadius: BorderRadius.circular(20.0),
                  child: Image.asset('assets/images/USUARIO_ICONO.png',
                      width: 110.0,
                      height: 110.0
                    ),
                ),
              ),
            ),
          ),
          
          Container(
              color: Colors.white70,
              padding: EdgeInsets.only(
                  left: size.height * 0.02,
                  right: size.height * 0.02,
                  top: size.height * 0.1),
              child: SingleChildScrollView(
                  child: Column(children: <Widget>[
                ListTile(
                  leading: Icon(
                    FontAwesomeIcons.thLarge,
                    color: Colors.red,
                  ),
                  title: Text(
                    'Mis aplicaciones',
                    style: TextStyle(
                        fontSize: 20,
                        fontWeight: FontWeight.bold,
                        color: Colors.red),
                  ),
                ),
                
                
              ]))),
              
          CardAPlicaciones(),
        ],
      ),
      
    );
  }
  
}


class CardAPlicaciones extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final servicesProvider = ServiciosLogin();
    return Container(
      decoration: BoxDecoration(
          image: DecorationImage(
        image: AssetImage("assets/images/FONDO.png"),
        fit: BoxFit.cover,
      )),
      child: Padding(
        padding: const EdgeInsets.fromLTRB(40, 100, 0, 0),
        child: FutureBuilder(
            future: servicesProvider.listarApps(),
            builder: (BuildContext context,
                AsyncSnapshot<List<Aplicacion>> snapshot) {
              if (snapshot.hasData) {
                final aplicaciones = snapshot.data;
                return GridView.builder(
                    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                        crossAxisCount: 2),
                    itemCount: aplicaciones.length,
                    itemBuilder: (BuildContext context, int index) {
                      return new _Card(aplicaciones[index]);
                    });
              } else {
                return Center(child: CircularProgressIndicator());
              }
            }),
      ),
    );
  }

  // obtiene la informacion de la app instalada

}

class _Card extends StatelessWidget {
  final Aplicacion app;
  _Card(this.app);
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Stack(
        children: <Widget>[
          Row(
            children: <Widget>[
              SizedBox(width: 10.0),
            ],
          ),
          Positioned(
              top: 35,
              left: 0,
              child: Column(
                children: <Widget>[
                  new RawMaterialButton(
                      onPressed: () => {DeviceApps.openApp(app.paquete)},
                      child: CircleAvatar(
                        backgroundColor: Colors.white,
                        radius: 50,
                        backgroundImage: NetworkImage(global.url   app.icono),
                      )),
                  Text(app.nombre,
                      style: TextStyle(
                          color: Colors.black,
                          fontSize: 16,
                          fontWeight: FontWeight.bold)),
                ],
              ))
        ],
      ),
    );
  }
}




 

Комментарии:

1. Вы пробовали перезапустить свое приложение?

2. да, когда я комментирую «CardAplicaciones», ящик работает нормально, я думаю, что проблема в контексте scaffold.

Ответ №1:

Попробуйте это, поместите чернильницу внутрь конструктора, чтобы получить контекст каркаса.

 child: Builder(scaffoldContext){
  return InkWell(
              onTap: () => Scaffold.of(scaffoldContext).currentState.openDrawer(),
              child: Container(
                child: ClipRRect(
                  borderRadius: BorderRadius.circular(20.0),
                  child: Image.asset('assets/images/USUARIO_ICONO.png',
                      width: 110.0,
                      height: 110.0
                    ),
                ),
              ),
            ),
}