Как мне работать с логинами на разных устройствах, основываясь на ответах API во флаттере? - PullRequest
0 голосов
/ 16 марта 2020

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

    Future<EventArticleList> getEventArticleList(String token) async {
    BuildContext context;
    Map<String, String> headers = {
      "Accept": "application/json",
      "Authorization": "Bearer $token"
    };
    var response = await client.get('$endpoint/', headers: headers);
    if (response.statusCode == 200) {
      print("Masuk Data");
      return EventArticleList.fromJson(
        json.decode(response.body),
      );
    } else if (response.statusCode == 401) {
      print("401");
      return Navigator.of(context)
          .pushNamedAndRemoveUntil(RoutePaths.Login, (_) => false);
    } else {
      throw Exception("ini Eror apa ?");
    }

  }

появляется компиляция. Я пытаюсь добавить навигатор обратно в status.code == 401

NoSuchMethodError: Метод 'ancestorStateOfType' был вызван для null

1 Ответ

0 голосов
/ 16 марта 2020

Попробуйте этот код

Ваш основной класс

    import 'package:flutter/material.dart';
import 'package:flutterapitut/view/adddata.dart';
import 'package:flutterapitut/view/dashboard.dart';
import 'package:flutterapitut/view/login.dart';
import 'package:flutterapitut/view/register.dart';

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

class MyApp extends StatelessWidget {

  final String title='';
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter CRUD API',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: LoginPage(title: 'Flutter CRUD API'),
      routes: <String,WidgetBuilder>{
        '/dashboard' : (BuildContext context) => new Dashboard(title:title),
        '/login' : (BuildContext context) => new LoginPage(title:title),
      },
    );
  }
}

Ваш класс помощника по базам данных

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class DatabaseHelper{

  String serverUrl = "http://flutterapitutorial.codeforiraq.org/api";
  var status ;

  var token ;

   loginData(String email , String password) async{

    String myUrl = "$serverUrl/login1";
  final response = await  http.post(myUrl,
        headers: {
          'Accept':'application/json'
        },
        body: {
          "email": "$email",
          "password" : "$password"
        } ) ;
    status = response.body.contains('error');

    var data = json.decode(response.body);

    if(status){
      print('data : ${data["error"]}');
    }else{
      print('data : ${data["token"]}');
      _save(data["token"]);
    }

  }


  _save(String token) async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'token';
    final value = token;
    prefs.setString(key, value);
  }


 read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'token';
    final value = prefs.get(key ) ?? 0;
    print('read : $value');
  } 
}

Ваш класс входа в систему

    import 'package:flutter/material.dart';
import 'package:flutterapitut/Controllers/databasehelper.dart';
import 'package:flutterapitut/view/dashboard.dart';
import 'package:flutterapitut/view/register.dart';
import 'package:shared_preferences/shared_preferences.dart';


class LoginPage extends StatefulWidget{

  LoginPage({Key key , this.title}) : super(key : key);
  final String title;

  @override
  LoginPageState  createState() => LoginPageState();
}

class LoginPageState extends State<LoginPage> {



  read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'token';
    final value = prefs.get(key ) ?? 0;
    if(value != '0'){
      Navigator.of(context).push(
          new MaterialPageRoute(
            builder: (BuildContext context) => new Dashboard(),
          )
      );
    }
  }

@override
initState(){
  read();
}




  DatabaseHelper databaseHelper = new DatabaseHelper();
  String msgStatus = '';

  final TextEditingController _emailController = new TextEditingController();
  final TextEditingController _passwordController = new TextEditingController();


  _onPressed(){
    setState(() {
      if(_emailController.text.trim().toLowerCase().isNotEmpty &&
          _passwordController.text.trim().isNotEmpty ){
        databaseHelper.loginData(_emailController.text.trim().toLowerCase(),
            _passwordController.text.trim()).whenComplete((){
              if(databaseHelper.status){
                _showDialog();
                msgStatus = 'Check email or password';
              }else{
                 Navigator.pushReplacementNamed(context, '/dashboard');


              }
        });
      }
    });
  }


  @override
  Widget build(BuildContext context) {

    return MaterialApp(
      title: 'Login',
      home: Scaffold(
        appBar: AppBar(
          title:  Text('Login'),
        ),
        body: Container(
          child: ListView(
            padding: const EdgeInsets.only(top: 62,left: 12.0,right: 12.0,bottom: 12.0),
            children: <Widget>[
              Container(
                height: 50,
                child: new TextField(
                  controller: _emailController,
                  keyboardType: TextInputType.emailAddress,
                  decoration: InputDecoration(
                    labelText: 'Email',
                    hintText: 'Place your email',
                    icon: new Icon(Icons.email),
                  ),
                ),
              ),

              Container(
                height: 50,
                child: new TextField(
                  controller: _passwordController,
                  keyboardType: TextInputType.text,
                  decoration: InputDecoration(
                    labelText: 'Password',
                    hintText: 'Place your password',
                    icon: new Icon(Icons.vpn_key),
                  ),
                ),
              ),
              new Padding(padding: new EdgeInsets.only(top: 44.0),),

              Container(
                height: 50,
                child: new RaisedButton(
                  onPressed: _onPressed,
                  color: Colors.blue,
                  child: new Text(
                    'Login',
                    style: new TextStyle(
                        color: Colors.white,
                        backgroundColor: Colors.blue),),
                ),
              ),
              new Padding(padding: new EdgeInsets.only(top: 44.0),),

              Container(
                height: 50,
                child: new Text(
                   '$msgStatus',
                   textAlign: TextAlign.center,
                  overflow: TextOverflow.ellipsis,
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
              new Padding(padding: new EdgeInsets.only(top: 44.0),),
              Container(
                height: 50,
                child: new FlatButton(
                  onPressed: ()=>Navigator.of(context).push(
                    new MaterialPageRoute(
                      builder: (BuildContext context) => new RegisterPage(),
                    )
                  )

                  ,
                  color: Colors.blue,
                  child: new Text(
                    'Register',
                    style: new TextStyle(
                        color: Colors.white,
                         ),),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }



  void _showDialog(){
    showDialog(
      context:context ,
      builder:(BuildContext context){
        return AlertDialog(
          title: new Text('Failed'),
          content:  new Text('Check your email or password'),
          actions: <Widget>[
            new RaisedButton(

              child: new Text(
                'Close',
                 ),

              onPressed: (){
                Navigator.of(context).pop();
              },

            ),
          ],
        );
      }
    );
  }

}

Здесь Dashboard - это класс, на который вы должны перейти после успешного входа в систему Хотите узнать больше кода? здесь Надеюсь, это работает правильно

...