Partage
  • Partager sur Facebook
  • Partager sur Twitter

'NoSuchmethodError' is not a subtype of 'String'

    7 septembre 2020 à 20:39:52

    Je rencontre cette erreur à chaque compilation et je trouve pas l'erreur, s'il vous plait aidez moi.

    voici mon code

    connexion.dart

    import 'package:flutter/material.dart';
    import 'package:flutter_bloc/flutter_bloc.dart';
    import 'package:panne/bloc/user_bloc.dart';
    import 'package:panne/db/database.dart';
    import 'package:panne/events/add_user.dart';
    import 'package:panne/events/presenter.dart';
    import 'package:panne/model/user.dart';
    import 'package:panne/screens/menu.dart';
    
    class Login extends StatefulWidget {
      Login({Key key}) : super(key: key);
      @override
      _LoginState createState() => _LoginState();
    }
    
    class _LoginState extends State<Login> implements LoginPage {
      String text = "";
      String _nom;
      String _email;
      String _password;
      bool affiche = true;
      bool page = true;
      DatabaseProvider db;
      LogPage _pres;
      final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
      final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
    
      _LoginState() {
        _pres = new LogPage(this);
      }
    
      void submit() {
        final form = _formKey.currentState;
        if (form.validate()) {
          setState(() {
            form.validate();
            _pres.doLog(_email, _password);
          });
        }
      }
    
      void _showSnackBar(String text) {
        _scaffoldKey.currentState.showSnackBar(new SnackBar(
          content: Text(text),
        ));
      }
    
      /**void fonction1() async {
        if (!_formKey.currentState.validate()) {
          return;
        }
        _formKey.currentState.save();
        User user = User(email: _email, password: _password);
        User utilise = await db.login(user);
        if (utilise != null) {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => Menu(user.id)));
        } else {
          _scaffoldKey.currentState
              .showSnackBar(new SnackBar(content: Text("Identifiants incorrects")));
        }
      }**/
    
      void vide() {}
    
      void fonction2() {
        if (!_formKey.currentState.validate()) {
          return;
        }
    
        _formKey.currentState.save();
    
        User utilisateur = User(_nom, _email, _password, null);
    
        DatabaseProvider.db.insert(utilisateur).then(
              (storedUser) => BlocProvider.of<UserBloc>(context).add(
                AddUser(storedUser),
              ),
            );
    
        Navigator.push(context, MaterialPageRoute(builder: (context) => Menu()));
      }
    
      Widget nom() {
        return TextFormField(
          initialValue: _email,
          decoration: InputDecoration(
            labelText: "Nom",
            icon: Icon(Icons.person),
            labelStyle: TextStyle(
              fontFamily: 'Montserrat',
              fontWeight: FontWeight.bold,
              color: Colors.grey,
            ),
            focusedBorder: UnderlineInputBorder(
              borderSide: BorderSide(
                color: Colors.red,
              ),
            ),
          ),
          validator: (String value) {
            if (value.trim().isEmpty) {
              return 'Ce champ est requis';
            } else {
              return null;
            }
          },
          onSaved: (String value) {
            _nom = value;
          },
        );
      }
    
      //Zone de texte email
      Widget email() {
        return TextFormField(
          initialValue: _email,
          decoration: InputDecoration(
            labelText: "Email",
            icon: Icon(Icons.mail),
            labelStyle: TextStyle(
              fontFamily: 'Montserrat',
              fontWeight: FontWeight.bold,
              color: Colors.grey,
            ),
            focusedBorder: UnderlineInputBorder(
              borderSide: BorderSide(
                color: Colors.red,
              ),
            ),
          ),
          validator: (String value) {
            if (value.trim().isEmpty) {
              return 'Ce champ est requis';
            } else {
              return null;
            }
          },
          onSaved: (String value) {
            _email = value;
          },
        );
      }
    
      //Zone de texte password
      Widget password() {
        return TextFormField(
          initialValue: _password,
          decoration: InputDecoration(
            labelText: 'Mot de pass',
            icon: Icon(Icons.lock),
            labelStyle: TextStyle(
              fontFamily: 'Montserrat',
              fontWeight: FontWeight.bold,
              color: Colors.grey,
            ),
            focusedBorder: UnderlineInputBorder(
              borderSide: BorderSide(
                color: Colors.red,
              ),
            ),
          ),
          obscureText: true,
          validator: (String value) {
            if (value.trim().isEmpty) {
              return 'Ce champ est requis';
            } else {
              return null;
            }
          },
          onSaved: (String value) {
            _password = value;
          },
        );
      }
    
      //Mot de pass oublié
      Widget forget() {
        return Container(
          alignment: Alignment(1.0, 0.0),
          padding: EdgeInsets.only(top: 15.0, left: 20.0),
          child: InkWell(
            child: Text(
              'Mot de pass oublié ?',
              style: TextStyle(
                color: Colors.red,
                fontFamily: 'Montserrat',
                fontWeight: FontWeight.bold,
              ),
            ),
          ),
        );
      }
    
      //Button de connexion et d'inscription
      Widget button1(text, vide()) {
        return Container(
          height: 40.0,
          child: Material(
            borderRadius: BorderRadius.circular(20.0),
            color: Colors.black,
            child: GestureDetector(
              onTap: () => vide(),
              child: Center(
                child: Text(
                  text,
                  style: TextStyle(
                    fontFamily: 'Montserrat',
                    color: Colors.white,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            ),
          ),
        );
      }
    
      //Button s'enregistrer et se connecter
      Widget button2(text, fonction()) {
        return Container(
          height: 40.0,
          color: Colors.transparent,
          child: Container(
            decoration: BoxDecoration(
              border: Border.all(
                color: Colors.black,
                style: BorderStyle.solid,
                width: 1.0,
              ),
              color: Colors.transparent,
              borderRadius: BorderRadius.circular(20.0),
            ),
            child: GestureDetector(
              onTap: () => fonction(),
              child: Center(
                child: Text(
                  text,
                  style: TextStyle(
                    fontFamily: 'Montserrat',
                    color: Colors.black,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            ),
          ),
        );
      }
    
      //Page de connexion
      Widget connection() {
        return Container(
          padding: EdgeInsets.fromLTRB(20.0, 35.0, 20.0, 0.0),
          child: Form(
            key: _formKey,
            child: Column(
              children: <Widget>[
                email(),
                SizedBox(
                  height: 30.0,
                ),
                password(),
                SizedBox(
                  height: 5.0,
                ),
                forget(),
                SizedBox(
                  height: 40.0,
                ),
                button1('CONNECTION', () {
                  submit();
                }),
                SizedBox(
                  height: 20.0,
                ),
                button2("S'ENREGISTRER", () {
                  setState(() {
                    page = false;
                  });
                }),
              ],
            ),
          ),
        );
      }
    
      Widget inscription() {
        return Container(
          padding: EdgeInsets.fromLTRB(20.0, 35.0, 20.0, 0.0),
          child: Form(
            key: _formKey,
            child: Column(
              children: <Widget>[
                nom(),
                SizedBox(
                  height: 30.0,
                ),
                email(),
                SizedBox(
                  height: 30.0,
                ),
                password(),
                SizedBox(
                  height: 5.0,
                ),
                forget(),
                SizedBox(
                  height: 40.0,
                ),
                button1('INSCRRIPTION', () {
                  fonction2();
                }),
                SizedBox(
                  height: 20.0,
                ),
                button2("SE CONNECTER", () {
                  setState(() {
                    page = true;
                  });
                }),
              ],
            ),
          ),
        );
      }
    
      //Build de la page
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(
                      'Bienvenue',
                      style: TextStyle(
                        fontFamily: 'Montserrat',
                        fontSize: 45,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    Text(
                      '.',
                      style: TextStyle(
                        color: Colors.red,
                        fontFamily: 'Montserrat',
                        fontSize: 45,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ],
                ),
                page == true ? connection() : inscription()
              ],
            ),
          ),
        );
      }
    
      @override
      void pasConnecte(String error) {
        _showSnackBar("Identifiants incorrect");
      }
    
      @override
      void bienConnecte(User user) {
        if (user.nom == "") {
          _showSnackBar("Connexion échoué");
        } else {
          _showSnackBar(user.toString());
        }
        if (user.flagLoged == "connecté") {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Menu()),
          );
        }
      }
    }
    

     rest_data.dart

    import 'package:panne/db/database.dart';
    import 'package:panne/model/user.dart';
    
    class RestData {
      static final BASE_URL = "";
      static final LOGIN_URL = BASE_URL + "/";
    
      Future<User> log(String username, String password) async {
        String flagLogged = "connecté";
    
        var user = new User(null, username, password, null);
        DatabaseProvider db;
        var userR = new User(null, null, null, null);
        userR = await db.login(user);
        if (userR != null) {
          flagLogged = "connecté";
          return new Future.value(new User(null, username, password, flagLogged));
        } else {
          flagLogged = "non";
          return new Future.value(new User(null, username, password, flagLogged));
        }
      }
    }
    

    presenter.dart

    import 'package:panne/db/rest_data.dart';
    import 'package:panne/model/user.dart';

    abstract class LoginPage {
      void bienConnecte(User user);
      void pasConnecte(String error);
    }

    class LogPage {
      LoginPage _view;
      RestData api = new RestData();
      LogPage(this._view);

      doLog(String username, String password) {
        api
            .log(username, password)
            .then((user) => _view.bienConnecte(user))
            .catchError((onError) => _view.pasConnecte(onError));
      }
    }

    user.dart

    //class utilisateur
    class User {
      int id;
      String _nom;
      String _email;
      String _password;
      String _flagLoged;
    
      User(this._nom, this._email, this._password, this._flagLoged);
    
      User.fromMap(dynamic obj) {
        this._nom = obj["nom"];
        this._email = obj["email"];
        this._password = obj["password"];
        this._flagLoged = obj["password"];
      }
    
      String get nom => _nom;
      String get email => _email;
      String get password => _password;
      String get flagLoged => _flagLoged;
    
      Map<String, dynamic> toMap() {
        var map = new Map<String, dynamic>();
        map["nom"] = _nom;
        map["email"] = _email;
        map["password"] = _password;
        map["flagLoged"] = _flagLoged;
    
        return map;
      }
    }
    

    database.dart

    import 'package:panne/model/panne.dart';
    import 'package:panne/model/user.dart';
    import 'package:path/path.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:sqflite/sqlite_api.dart';

    class DatabaseProvider {
      static const String TABLE_UTILISATEUR = "utilisateur";
      static const String COLONNE_ID = "id";
      static const String COLONNE_NOM = "nom";
      static const String COLONNE_EMAIL = "email";
      static const String COLONNE_PASSWORD = "password";
      static const String TABLE_PANNES = "pannes";
      static const String COLONNE_DESCRIPTION = "description";
      static const String COLONNE_FLAG = "flagLoged";

      DatabaseProvider._();
      static final DatabaseProvider db = DatabaseProvider._();

      Database _database;

      //Recupérer la base de donnée
      Future<Databaseget database async {
        print("database getter called");

        if (_database != null) {
          return _database;
        }

        _database = await createDatabase();

        return _database;
      }

      //Ouvrir la base de donnée (Elle est crée si elle n'existe pas)
      Future<DatabasecreateDatabase() async {
        String dbPath = await getDatabasesPath();

        return await openDatabase(
          join(dbPath, 'fods.db'),
          version: 1,
          onCreate: (Database database, int version) async {
            print("Creating food table");

            //Créer les tables
            await database.execute(
              "CREATE TABLE $TABLE_UTILISATEUR ("
              "$COLONNE_ID INTEGER PRIMARY KEY,"
              "$COLONNE_NOM TEXT NOT NULL,"
              "$COLONNE_EMAIL TEXT NOT NULL,"
              "$COLONNE_PASSWORD TEXT NOT NULL,"
              "$COLONNE_FLAG TEXT"
              ")",
            );

            await database.execute(
              "CREATE TABLE $TABLE_PANNES ("
              "$COLONNE_ID INTEGER PRIMARY KEY,"
              "$COLONNE_NOM TEXT NOT NULL,"
              "$COLONNE_DESCRIPTION TEXT NOT NULL"
              ")",
            );
          },
        );
      }

      //Récuperer la liste des pannes
      Future<List<Panne>> getPanne() async {
        final db = await database;

        var pannes = await db.query(TABLE_PANNES,
            columns: [COLONNE_IDCOLONNE_NOMCOLONNE_DESCRIPTION]);

        List<Panne> panneList = List<Panne>();

        pannes.forEach((currentPanne) {
          Panne panne = Panne.fromMap(currentPanne);

          panneList.add(panne);
        });

        return panneList;
      }

      //Récuperer la liste des utilisateurs
      Future<List<User>> getUser() async {
        final db = await database;

        var users = await db.query(TABLE_UTILISATEUR,
            columns: [COLONNE_IDCOLONNE_NOMCOLONNE_EMAIL]);

        List<User> userList = List<User>();

        users.forEach((currentUser) {
          User user = User.fromMap(currentUser);

          userList.add(user);
        });

        return userList;
      }

      //Ajouter un utilisateur
      Future<Userinsert(User utilisateur) async {
        final db = await database;
        utilisateur.id = await db.insert(TABLE_UTILISATEUR, utilisateur.toMap());
        return utilisateur;
      }

      //Ajouter une panne
      Future<PanneinsertToPanne(Panne panne) async {
        final db = await database;
        panne.id = await db.insert(TABLE_PANNES, panne.toMap());
        return panne;
      }

      //Rechercher un utilisateur
      Future<Userlogin(User user) async {
        final db = await database;
        var res = await db.query(TABLE_UTILISATEUR,
            columns: [COLONNE_EMAILCOLONNE_PASSWORD],
            where: "$COLONNE_EMAIL = ? AND $COLONNE_PASSWORD = ?",
            whereArgs: [user.email, user.password]);
        if (res.length > 0) {
          return user;
        }
        return null;
      }

      //Recuperer les informations d'un utilisateur
      Future<Userinfo(int id) async {
        final db = await database;
        var req = await db
            .rawQuery("SELECT * FROM $TABLE_UTILISATEUR WHERE $COLONNE_ID = $id");
        if (req.length > 0) {
          return User.fromMap(req.first);
        }
        return null;
      }

      //Supprimer un utilisateur
      Future<intdelete(int id) async {
        final db = await database;

        return await db.delete(
          TABLE_UTILISATEUR,
          where: "id = ?",
          whereArgs: [id],
        );
      }

      //Supprimer une panne
      Future<intdeletePanne(int id) async {
        final db = await database;

        return await db.delete(
          TABLE_PANNES,
          where: "id = ?",
          whereArgs: [id],
        );
      }

      //Actualiser un utilisateur
      Future<intupdate(User utilisateur) async {
        final db = await database;

        return await db.update(
          TABLE_UTILISATEUR,
          utilisateur.toMap(),
          where: "id = ?",
          whereArgs: [utilisateur.id],
        );
      }

      //Actualiser une panne
      Future<intupdatePanne(Panne panne) async {
        final db = await database;

        return await db.update(
          TABLE_PANNES,
          panne.toMap(),
          where: "id = ?",
          whereArgs: [panne.id],
        );
      }
    }
    • Partager sur Facebook
    • Partager sur Twitter
      7 septembre 2020 à 23:56:54

      Bonjour,  Vous ne donnez pas l'erreur que vous rencontrez....

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: java;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Manque de Politesse

      Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        8 septembre 2020 à 9:56:30

        Tu rencontres cette erreur a chaque compilation, mais de quelle erreur s'agit il ?

        Peut tu mettre les logs qui correspondent au problème ou éventuellement les zones qui sont en erreur (souligné en rouge) dans ton code

        EDIT : Autant pour moi, c'est dans le titre

        Peux tu nous dire a quelle ligne est cette erreur

        -
        Edité par MaximeG31 8 septembre 2020 à 9:57:26

        • Partager sur Facebook
        • Partager sur Twitter

        'NoSuchmethodError' is not a subtype of 'String'

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown