【问题标题】:Flutter _scaffoldKey.currentState.openDrawer() doesn't workFlutter _scaffoldKey.currentState.openDrawer() 不起作用
【发布时间】:2021-02-23 14:27:47
【问题描述】:

我有以下问题:我有一个显示图像的主类,它调用抽屉。到目前为止它工作正常,但是当我调用正文中的另一个类(CardApplications)时,抽屉不起作用。我仍然不知道如何解决它。 当我不上课时 使用 _scaffoldKey 正确调用了“CearAplicaciones”抽屉,但如果我调用它,绝对不会发生任何事情,甚至不会出现错误。

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)),
                ],
              ))
        ],
      ),
    );
  }
}




【问题讨论】:

  • 你尝试重启你的应用了吗?
  • 是的,当我评论“CardAplicaciones”时,抽屉运行良好,我认为脚手架上下文的问题。

标签: android flutter drawer


【解决方案1】:

试试这个,将 InkWell 放入 Builder 中以获取脚手架的上下文。

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
                    ),
                ),
              ),
            ),
}

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 2020-02-06
    • 1970-01-01
    • 2021-05-17
    • 2021-11-18
    • 2018-09-17
    • 2021-02-13
    • 2020-09-21
    • 2021-04-29
    相关资源
    最近更新 更多