У меня проблема с пакетом awesome_page_transition со страницей выхода - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь использовать этот пакет для своего мобильного приложения. Создает эффект для всех переходных страниц. Вот ссылка на пакет: https://pub.dev/packages/awesome_page_transitions. Рекомендуемый код:

onPressed: () => Navigator.push(
        context,
        AwesomePageRoute(
          transitionDuration: Duration(milliseconds: 600),
          exitPage: widget,
          enterPage: SecondScreen(),
          transition: CubeTransition(),
        ),
      ),

enterPage - это страница назначения, все в порядке. Моя проблема с exitPage, там написано «виджет». На одной из моих страниц он работает, «виджет» распознается, поэтому ошибок нет, и все работает, но на других страницах у меня есть ошибка «undefined name 'widget'».

Итак, мой вопрос в том, что такое виджет "и почему он не распознается на некоторых страницах.

Вот мой код:

import 'package:flutter/material.dart';
import 'login.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:flutter_app/home.dart';
import 'package:flutter_app/globals.dart' as globals;
import 'package:awesome_page_transitions/awesome_page_transitions.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  final appTitle = 'WINACOIN';

  String mail;
  String pass;

  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'WINACOIN',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          fontFamily: 'Azonix',
        ),
        home: MyHome()
    );
  }
}

class MyHome extends StatelessWidget {
  @override

  String mail='';
  String pass='';

  Widget build(BuildContext context) {
    return Scaffold(
        appBar: new AppBar(
          title: new Text("WINACOIN"),
        ),
        body: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
                colors: [Colors.blue[400],Colors.blue[600],Colors.blue[800]],
                begin: Alignment.topLeft,
                end: Alignment.bottomRight),
          ),
          child :
          Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Container(
                  margin : const EdgeInsets.only(bottom:20),
                  child: Text('JEU 100 % GRATUIT 100 % GAGNANT',style: TextStyle(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w500)),
                ),
                Container(
                  margin : const EdgeInsets.only(bottom:20),
                  child: Text('GAGNEZ DES CADEAUX ET DES EUROS',style: TextStyle(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w500)),
                ),
                RaisedButton(
                  textColor: Colors.white,
                  color: Colors.green,
                  child: Text('COMMENCER',style: TextStyle(color: Colors.white,fontSize: 15,fontWeight: FontWeight.w500)),
                  onPressed: () async {
                    bool islog = await isconnect();
                    if (islog==false) {
                      Navigator.push(
                          context,
                        AwesomePageRoute(
                          transitionDuration: Duration(milliseconds: 1000),
                          exitPage: MyApp(),
                          enterPage: LoginPage(),
                          transition: RotateUpTransition(),
                        ),
                      );
                    }
                    else {
                      Navigator.push(
                          context,
                        AwesomePageRoute(
                          transitionDuration: Duration(milliseconds: 1000),
                          exitPage: MyApp(),
                          enterPage: HomePage(),
                          transition: RotateUpTransition(),
                        ),
                      );
                    }
                  },
                )
              ],
            ),
          ),
        )
    );
  }

  Future <bool> isconnect() async {
    // Create storage

    final storage = new FlutterSecureStorage();

// Read value

    mail = await storage.read(key: "e");
    pass = await storage.read(key: "p");

    if (mail!=null && pass!=null) {

      var url = 'https://www.easytrafic.fr/game_app/login.php';

      // Store all data with Param Name.
      var data = {'email': mail, 'password': pass};

      // Starting Web API Call.
      var response = await http.post(url, body: json.encode(data),headers: {'content-type': 'application/json','accept': 'application/json'});

      print(json.decode(response.body));
      // Getting Server response into variable.

      Map <String,dynamic> map = json.decode(response.body);

      // If the Response Message is Matched.
      if (map["status"] == 1) {
        // l'email et le mot de passe sont correct
        final storage = new FlutterSecureStorage();

        await storage.write(key: "i", value: map["id_membre"]);
        await storage.write(key: "e", value: mail);
        await storage.write(key: "p", value: pass);
        await storage.write(key: "t", value: map["jwt"]);

        globals.id_membre=map["id_membre"];
        globals.token=map["jwt"];
        globals.balance=double.parse(map["balance"]);
        globals.points=map["nb_points"];
        print("la connexion a réussi avec les identifiants");

        return true;
      }
      else {
        // l'email et mot de passe stocké ne permettent pas de se connecter
        // rediriger vers la fenêtre de login
        print("mauvais identifiants");
        return false;
      }
    }
    else {
      // email et password n'existe pas
      print("email et password vide");
      return false;
    }
  }

}

У меня немного другая проблема на другой странице, это класс, который отображает ящик :

Вот код:

import 'package:flutter/material.dart';
import 'package:flutter_app/grille_lotosport.dart';
import 'package:flutter_app/liste_grattage.dart';
import 'package:flutter_app/liste_tombolas.dart';
import 'package:flutter_app/login.dart';
import 'package:flutter_app/home.dart';
import 'package:flutter_app/liste_grille_lotto.dart';
import 'package:flutter_app/liste_pronostics.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_app/globals.dart' as globals;
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:flutter_app/boutique.dart';
import 'package:awesome_page_transitions/awesome_page_transitions.dart';

class DrawerOnly extends StatelessWidget {
  @override
  Widget build (BuildContext ctxt) {
    return new Drawer(
        child: new ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            new DrawerHeader(
              child: Column(
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(5),
                    child: Icon(
                      FontAwesomeIcons.userAlt,
                      size: 40,
                      color: Colors.white
                    ),
                  ),
                  Container(
                    margin: EdgeInsets.only(bottom:10),
                    padding: EdgeInsets.all(5),
                      width: 150,
                      height:35,
                      decoration: BoxDecoration(
                        border: Border.all(
                          color: Colors.white,
                          width: 2,
                        ),
                        borderRadius: BorderRadius.circular(25),
                      ),
                    child: Center(
                    child: RichText(
                    text: TextSpan(
                    children: [
                    WidgetSpan(
                    child: Icon(FontAwesomeIcons.euroSign,color: Colors.amber[200],size:20)
                    ),
                    TextSpan(
                    text: (globals.balance??0).toString(),
                    style: TextStyle(fontSize: 20,fontWeight: FontWeight.w800,color: Colors.white)
                    ),
                    ],
                    ),
                    )
                    )
                  ),
                  Container(
                      width: 150,
                      height:35,
                      decoration: BoxDecoration(
                        border: Border.all(
                          color: Colors.white,
                          width: 2,
                        ),
                        borderRadius: BorderRadius.circular(25),
                      ),
                      child: Center(
                          child: RichText(
                            text: TextSpan(
                              children: [
                                WidgetSpan(
                                    child: Icon(FontAwesomeIcons.solidGem,color: Colors.amber[200],size: 20)
                                ),
                                TextSpan(
                                    text: " "+(globals.points??0).toString(),
                                    style: TextStyle(fontSize: 20,fontWeight: FontWeight.w800,color: Colors.white)
                                ),
                              ],
                            ),
                          )
                      )
                  ),
                  ],
              ),
              decoration: BoxDecoration(
                  gradient: LinearGradient(
                    begin: Alignment.topLeft,
                    end: Alignment.bottomRight,
                    colors: <Color>[
                      Colors.blue[400],Colors.blue[600],Colors.blue[800]
                    ],
                  ),
                  color: Colors.lightBlue,
                  borderRadius: new BorderRadius.only(
                  bottomLeft:  const  Radius.circular(25.0),
                  bottomRight: const  Radius.circular(25.0)
                  )
              ),
            ),
            new ListTile(
              leading: new Icon(FontAwesomeIcons.home),
              title: new Text("ACCUEIL"),
              onTap: () {
                Navigator.pop(ctxt);
                Navigator.push(ctxt,
                    new MaterialPageRoute(builder: (ctxt) => new HomePage()));
              },
            ),
            new ExpansionTile(
              leading: new Icon(FontAwesomeIcons.play),
              title: Text("NOS JEUX"),
              children: <Widget>[
                new ListTile(
                  title: new Text("LOTOSPORT"),
                  onTap: () {
                    Navigator.pop(ctxt);
                    Navigator.push(ctxt,
                        new MaterialPageRoute(builder: (ctxt) => new Affiche_Liste_grille()));
                  },
                ),
                new ListTile(
                  title: new Text("PRONOSTICS"),
                  onTap: () {
                    Navigator.pop(ctxt);
                    Navigator.push(ctxt,
                        new MaterialPageRoute(builder: (ctxt) => new Affiche_Matchs())
                    );
                  }
                ),
                new ListTile(
                  title: new Text("LOTERIE"),
                  onTap: () {
                    Navigator.pop(ctxt);
                    Navigator.push(ctxt,
                        new MaterialPageRoute(builder: (ctxt) => new Affiche_Liste_Lotto()));
                  },
                ),
                new ListTile(
                  title: new Text("TOMBOLA"),
                  onTap: () {
                    Navigator.pop(ctxt);
                    Navigator.push(ctxt,
                        new MaterialPageRoute(builder: (ctxt) => new Affiche_Liste_Tombola())
                    );
                  },
                ),
                new ListTile(
                  title: new Text("TICKET A GRATTER"),
                  onTap:() {
                    Navigator.pop(ctxt);
                    Navigator.push(ctxt,
                        new MaterialPageRoute(builder: (ctxt) => new Affiche_Liste_Grattage()));
                  }
                )
              ],
            ),
            new ListTile(
              leading: new Icon(FontAwesomeIcons.gift),
              title: new Text("BOUTIQUE"),
              onTap: () {
                Navigator.pop(ctxt);
                Navigator.push(ctxt,
                    new MaterialPageRoute(builder: (ctxt) => new Affiche_Boutique()));
              },
            ),
            new ListTile(
              leading: new Icon(FontAwesomeIcons.signOutAlt),
              title: new Text("DECONNEXION"),
              onTap: () async {
                final storage = new FlutterSecureStorage();

                await storage.deleteAll();

                globals.id_membre="";
                globals.token="";
                globals.balance=0.00;

                Navigator.pop(ctxt);
                Navigator.push(ctxt,
                    new MaterialPageRoute(builder: (ctxt) => new LoginPage()));
              },
            ),
          ],
        )
    );
  }
}

Я хочу использовать тот же метод, поэтому:

Navigator.pu sh (context, AwesomePageRoute (transitionDuration: Duration (миллисекунды: 600), exitPage: widget, enterPage: SecondScreen (), transition: CubeTransition (),),), контекст в порядке, но страница выхода - та же проблема, к которой я не могу получить доступ, и я не могу вызвать page напрямую, потому что в этом классе я не знаю, на какой мы странице. Возможно, мне нужно каждый раз передавать эту информацию этому классу, но как ??? На данный момент я называю это так: drawer: new DrawerOnly (), на каждой странице я могу передать информацию о виджете? Если да, то как? Спасибо ''

1 Ответ

0 голосов
/ 05 мая 2020

В первом случае, когда он работает, я думаю, что это виджет с отслеживанием состояния, когда виджет действует как имя вашего класса.

Пример. Если ваш виджет с отслеживанием состояния - FirstApp, он будет ссылаться на него, если вы передадите виджет. Поскольку мы обращаемся к переменным, когда получаем из другого класса.

В случае StateFul Widget:

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

В состоянии

AwesomePageRoute(
            transitionDuration: Duration(milliseconds: 600),
            exitPage: widget,  //  exitPage: DeleteWidget(), both will work

            enterPage: SecondScreen(),
            transition: CubeTransition(),
          ),

Теперь, где выдает ошибку ваш виджет stless, потому что этот виджет недоступен. Чтобы решить вашу проблему, вы можете назначить имя своего класса вместо Widget.

В Widget без сохранения состояния.

  class SecondScreen extends StatelessWidget {

Вы должны указать следующим образом.

    AwesomePageRoute(
            transitionDuration: Duration(milliseconds: 600),
            exitPage: SecondScreen(),  // because in stless their in now widget
            enterPage: DeleteWidget(),
            transition: CubeTransition(),
          ),

Обновление:

Вы должны назначить ящик (DrawerOnly) в любом классе (виджет с сохранением состояния / без состояния) в свойстве ящика для scaffold, затем вы можете передать это имя класса и присвоить это значение exitPage.

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      drawer: CustomDrawer(
        className: DeleteWidget(),
      ),
      body: Container(
        child: Column(
          children: [
            RaisedButton(
              onPressed: () {},
              child: Text("hello"),
            ),
          ],
        ),
      ),
    );
  }
}

class CustomDrawer extends StatefulWidget {
  final Widget className;
  CustomDrawer({this.className});
  @override
  _CustomDrawerState createState() => _CustomDrawerState();
}

class _CustomDrawerState extends State<CustomDrawer> {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        children: [
          new ListTile(
            leading: new Icon(Icons.home),
            title: new Text("ACCUEIL"),
            onTap: () {
              Navigator.pop(context);
              Navigator.push(
                  context,
                  AwesomePageRoute(
                    transitionDuration: Duration(milliseconds: 600),
                    exitPage: widget.className,
                    enterPage: HomePage(),
                    transition: CubeTransition(),
                  ));
            },
          ),
        ],
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      drawer: CustomDrawer(),
      body: Center(
        child: Container(
          child: Text("HomePage"),
        ),
      ),
    );
  }
}
...