Виджет в будущем - PullRequest
       18

Виджет в будущем

0 голосов
/ 03 апреля 2020

Я пытаюсь использовать диалоговый виджет, который будет получать некоторую информацию от будущего сборщика, когда я создаю диалог в onTap, он работает, но код выглядит таким странным образом, потому что я использую эту сборку более одного раза, поэтому я хочу создать класс диалога, затем вызывать его, когда мне нужно, но я пока не могу этого достичь, возможно ли это? Ниже приведены мои примеры кода:

Код на экране, который я пытался вызвать в диалоговом окне (homepage.dart):

 void showCast() {
    showDialog<void>(
        context: context,
        builder: (context){
          return CastDialog();
        }
    );
  }

@override
  Widget build(BuildContext context) {
    return FutureBuilder<Payload>(
...
...
...

                                 child: GestureDetector(
                                                        child: Image.network(
                                                          snapshot.data
                                                              .movieCast[index]
                                                              .image != null
                                                              ? "http://image.tmdb.org/t/p/w185" +
                                                              snapshot.data
                                                                  .movieCast[index]
                                                                  .image
                                                              : "http://image.tmdb.org/t/p/original/zUqyn3aQXTzeP1n8yd8Udt1twYA.jpg",
                                                          fit: BoxFit.contain,),
                                                        onTap: () async {
                                                          List<dynamic> castVar;
                                                          http.Response responseC = await http.get("http://lunedor.pythonanywhere.com/query?castid=${snapshot.data.movieCast[index].castID}&language=${AppLocalizations.of(context).translate('lan_code')}").timeout(const Duration(seconds: 10));

                                                          Map<String, dynamic>  castV = jsonDecode(responseC.body);
                                                          castVar = castV['moviecastimages'];
                                                          print(castVar);
                                                          String nameC = (snapshot.data.movieCast[index]).toString();
                                                          String _movieCast = (snapshot.data.movieCast[index]).toString();
                                                          String _url = (snapshot.data.movieCast[index].castID).toString();

                                                          return
                                                                showCast();

                                                        },
                                                      ),

Код для диалога (dialogs.dart):

class CastDialog extends StatefulWidget{
  @override
  _CastDialogState createState() => _CastDialogState();
}
class _CastDialogState extends State<CastDialog> {
  String nameC;
  String _movieCast;
  String _url;
  List castVar;

  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {

    return SimpleDialog(
      title:
      Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          SizedBox(
            width: 20,
            height: 20,
            child:  GestureDetector(
                onTap: () async{
                  http.Response responseB = await http.get("https://api.themoviedb.org/3/person/$_url?api_key=1b8cfaea32775f684a7baff93bb1a3fc&language=${AppLocalizations.of(context).translate('lan_code')}").timeout(const Duration(seconds: 10));
                  Map<String, dynamic>  castCB = jsonDecode(responseB.body);
                  return showDialog(context: context,
                      builder: (context) {
                        return SimpleDialog(
                          title: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: <Widget>[
                              Text(nameC),
                              SizedBox(
                                width: 20,
                                height: 20,
                                child:  GestureDetector(
                                    onTap: (){  Navigator.pop(context);},
                                    child: Icon(Icons.close)),
                              ),
                            ],
                          ),
                          children: <Widget>[
                            Divider(
                              color: Colors.black.withOpacity(0.5),
                              height: 5,
                              thickness: 3,
                            ),
                            Wrap(
                              children: <Widget>[
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Container(
                                    child: Text(castCB['biography'], style: TextStyle(fontSize: 14),),
                                  ),
                                ),
                              ],
                            ),],
                        );
                      });
                },
                child: Icon(Icons.info)),
          ),
          Text(_movieCast),
          SizedBox(
            width: 20,
            height: 20,
            child:  GestureDetector(
                onTap: (){  Navigator.pop(context);},
                child: Icon(Icons.close)),
          ),
        ],
      ),
      shape: RoundedRectangleBorder(borderRadius: new BorderRadius.circular(15.0)),
      children: <Widget>[
        Divider(
          color: Colors.black.withOpacity(0.5),
          height: 5,
          thickness: 3,
        ),
        Material(
          child: Container(
            width: 400,
            height: 600,
            child: new GridView.builder(
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2,
                  childAspectRatio: 1.5 /
                      2.5,
                ),
                itemCount: castVar.length,
                itemBuilder: (context, index) {
                  return Column(
                    children: <
                        Widget>[
                      SizedBox(
                        height: 220,
                        child: Stack(
                          children: <Widget>[
                            Image.network(castVar[index]['poster'] != null ? "http://image.tmdb.org/t/p/w185" + castVar[index]['poster']
                                : "https://i.hizliresim.com/bbn0VB.jpg", fit: BoxFit.contain),
                            Container(
                                width: MediaQuery
                                    .of(context)
                                    .size
                                    .width,
                                height: 220,
                                alignment: Alignment.bottomLeft,
                                padding: EdgeInsets.only(bottom: 5.0),
                                margin: const EdgeInsets.only(
                                    left: 5.0),
                                child: new CircularPercentIndicator(
                                  radius: 40.0,
                                  lineWidth: 5.0,
                                  percent: double.tryParse(
                                      castVar[index]['vote'])/10,
                                  center: Stack(
                                    children: <Widget>[
                                      Text(
                                        castVar[index]['vote'],
                                        style: TextStyle(
                                          foreground: Paint()
                                            ..style = PaintingStyle.stroke
                                            ..strokeWidth = 3
                                            ..color = Colors.black,
                                        ),
                                      ),
                                      new Text(castVar[index]['vote'],
                                        style: TextStyle(
                                          fontWeight: FontWeight.bold,
                                          color: Colors.amber,),),
                                    ],
                                  ),
                                  progressColor: Colors.amber,
                                )
                            ),],
                        ),
                      ),
                      Text(castVar[index]['title'], maxLines: 1,
                          textAlign: TextAlign.center,
                          style: TextStyle(
                              fontSize: 14.0,
                              fontWeight: FontWeight.bold)
                      ),
                      Text("(" + castVar[index]['year'] + ")", maxLines: 1,
                        textAlign: TextAlign.center,
                        style: TextStyle(
                          fontSize: 14.0,
                          fontWeight: FontWeight.bold,),
                      )
                    ],
                  );
                }),
          ),
        ),
      ],
    );
  }
}
...