Как создать страницу входа во флаттере, используя пакет path_provider для хранения входа в локальный файл - PullRequest
0 голосов
/ 22 января 2020

Я создал метод сохранения и метод чтения для хранения учетных данных.

В приведенном ниже коде username и password будут сохранены в файле.

Код также указав путь к каталогу, где он будет храниться, но он не работает должным образом при нажатии на кнопку входа в систему. Код представляет собой экран входа в систему, который появляется, когда мы открываем приложение в первый раз. Страница входа в учетную запись пользователя откроется после заполнения учетных данных. Он никогда не будет запрашивать у пользователя логины, пока пользователь не очистит данные или не удалит приложение. В этом коде username и password - текстовое поле, это флажок на экране входа в систему, который будет действовать как поле запомнить меня. Он будет вызывать метод сохранения по щелчку, и теперь я хочу, чтобы этот флажок сохранял учетные данные только после нажатия кнопки входа в систему.

  class  LoginPageState extends State<LoginPage> {
  TextEditingController username = new TextEditingController();
  TextEditingController password = new TextEditingController();

  bool checkValue = false;
  String user ="username";
  String pass="password";


 @override
  void initState() {
    super.initState();
    // call credentials method
    readuser().then((String value) {
      setState(() {
        user="username";
        user = value;
      });
    });
    readpass().then((String value) {
      setState(() {
        pass="password";
        pass = value;
      });
    });
  }

  bool checkingdata() {
    if (user.length !=0 && pass.length != 0) {
      return true;
    } else {
      return false;
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        elevation: 0.0,
        backgroundColor: Colors.white12,
      ),
      body: new SingleChildScrollView(
        child: _body(),
        scrollDirection: Axis.vertical,
      ),
    );
  }

  Widget _body() {
    return new Container(
      padding: EdgeInsets.only(right: 20.0, left: 20.0),
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: <Widget>[
          new Container(
            margin: EdgeInsets.all(30.0),
            child: new Image.asset(
              "assets/images/flutter_icon.png",
              height: 100.0,
            ),
          ),
          new TextField(
            onSubmitted: (_) {
              setState(() {
                user = username.text;``
              });
            },
            controller: username,
            decoration: InputDecoration(
                hintText: "username",
                hintStyle: new TextStyle(color: Colors.grey.withOpacity(0.3))),
          ),
          new TextField(
              controller: password,
              obscureText: true,
              onSubmitted: (_) {
                setState(() {
                  pass = password.text;
                });
              },
              decoration: InputDecoration(
                  hintText: "password",
                  hintStyle:
                  new TextStyle(color: Colors.grey.withOpacity(0.3)))),
          new CheckboxListTile(
           value: checkValue,

            title: new Text("Remember me"),
            controlAffinity: ListTileControlAffinity.leading,
            onChanged: (bool value) { checkingdata();

              _saved(user, pass);
            },
          ),
          new Container(
            decoration:
            new BoxDecoration(border: Border.all(color: Colors.black)),
            child: new ListTile(
              title: new Text(
                "Login",
                textAlign: TextAlign.center,
              ),
              onTap: _saved(user, pass),
            ),
          )
        ],
      ),
    );
  }

  //for username
  _saved (String text,String text2) async {
    print("asggd");
    final userfile = await _localFile;
      //print("asd");
    // Write the file.
    _savedpass(text2);
    print("asded");

    return userfile.writeAsString(text);
  }
  //for password
  _savedpass(String text) async {
    final passfile = await _localFile;
    // Write the file.
    return passfile.writeAsString(text);
  }

  Future<String> readuser() async {
    try {
      final userfile = await _localFile;


      // Read the file.
      String contents = await userfile.readAsString();

      return contents;
    } catch (e) {
      // If encountering an error, return 0.
     //return "dfd";
    }
  }

  Future<String> readpass() async {
    try {
      final userpass = await _localFile;


      // Read the file.
      String contents = await userpass.readAsString();

      return contents;
    } catch (e) {
      // If encountering an error, return 0.
      //return;
    }
  }Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }
  Future<File> get _localFile async {
  var _localPath;
  final path = await _localPath;
  return File('$path/counter.txt');
}
}

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

Ответы [ 2 ]

0 голосов
/ 22 января 2020

у вас может не быть файла counter.txt, поэтому вам нужно сначала его создать. Я бы посоветовал вам использовать shared_preferences или hive для хранения ваших данных.

Например, для shared_preferences это будет выглядеть так, как показано ниже:

Для извлечения данных

final prefs = await SharedPreferences.getInstance();

final login = prefs.getString('login');
final password = prefs.getString('password');

// It's important to check it to the null

if (login != null && password != null) {
  // Use it
}

Для сохранения новых данных

final prefs = await SharedPreferences.getInstance();

await prefs.setString('login', login);
await prefs.setString('password', password);

И вы также можете удалить из предпочтения:

final prefs = await SharedPreferences.getInstance();

await prefs.remove('login');
await prefs.remove('password');
0 голосов
/ 22 января 2020

Если оставить в стороне тот факт, что вы хотите сохранить свои учетные данные в виде открытого текста в локальном файле, ваша проблема - ваш _localFile получатель. Вы определяете локальную переменную _localPath, поэтому в следующей строке кода все, что вы получаете, это null. Кроме того, вы, вероятно, хотите создать свой файл, если он не существует, просто вызвав file.create().

...