首页 > 解决方案 > 使用 sqflite 数据库退出 Flutter 应用程序

问题描述

我正在尝试编写用于退出登录的颤振应用程序的代码(地图的数据库是用 sqflite 制作的)。

但是我收到以下错误消息:

颤振:NoSuchMethodError:在 null 上调用了方法“通知”。接收者:空尝试调用:通知('AuthState'的实例)

在下面提供了所需文件的代码。

我正在尝试在 home_screen.dart 文件中加入注销功能,但我觉得我缺少、 和auth.dart文件auth_provider.dart之间的链接。该问题所需文件的代码如下:login_screen.darthome_screen.dart

文件:database_helper.dart

import 'dart:async';
import 'dart:io' as io;

import 'package:path/path.dart';
import 'package:better_login/user.dart';
import 'package:sqflite/sqflite.dart' ;
import 'package:path_provider/path_provider.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = new
  DatabaseHelper.internal();
  factory DatabaseHelper() => _instance;

  static Database _db;

  Future<Database> get db async {
    if(_db != null)
      return _db;
     _db = await initDb();
    return _db;
  }

  DatabaseHelper.internal();

  initDb() async {
    io.Directory documentsDirectory = await
    getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "main.db");
    var theDb = await openDatabase(path, version: 1, onCreate:
    _onCreate);
    return theDb;
  }


  void _onCreate(Database db, int version) async {
    // When creating the db, create the table
    await db.execute(
        "CREATE TABLE User(username TEXT,password TEXT)");
    print("Created tables");
  }

   Future<int> saveUser(User user) async {
    var dbClient = await db;
    int res = await dbClient.insert("User", user.toMap());
    return res;
  }

  Future<int> deleteUsers() async {
    var dbClient = await db;
    int res = await dbClient.delete("User");
    return res;
  }

  Future<bool> isLoggedIn() async {
    var dbClient = await db;
    var res = await dbClient.query("User");
    return res.length > 0? true: false;
  }
}

文件:auth.dart

import 'package:better_login/database_helper.dart';

enum AuthState{ LOGGED_IN, LOGGED_OUT }

abstract class AuthStateListener {
  void onAuthStateChanged(AuthState state);

}

class AuthStateProvider {
  static final AuthStateProvider _instance = new
  AuthStateProvider.internal();

  List<AuthStateListener> _subscribers;

  factory AuthStateProvider() => _instance;
  AuthStateProvider.internal() {
    _subscribers = new List<AuthStateListener>();
    initState();
  }

   void initState() async {
    var db = new DatabaseHelper();
    var isLoggedIn = await db.isLoggedIn();
    if(isLoggedIn)
      notify(AuthState.LOGGED_IN);
    else
      notify(AuthState.LOGGED_OUT);
  }

  void subscribe(AuthStateListener listener) {
    _subscribers.add(listener);
  }

  void dispose(AuthStateListener listener) {
    for(var l in _subscribers) {
      if(l == listener)
        _subscribers.remove(l);
    }
  }

   void notify(AuthState state) {
    _subscribers.forEach((AuthStateListener s) =>
        s.onAuthStateChanged(state));
  }
}

文件:auth_provider.dart

import 'package:flutter/material.dart';
import 'package:better_login/auth.dart';

class AuthProvider extends InheritedWidget {
  const AuthProvider({Key key, Widget child, this.auth}) :    super(key: key, child: child);
  final AuthStateListener auth;

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;

   static AuthProvider of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(AuthProvider);
  }
}

文件:home_screen.dart

import 'package:flutter/material.dart';
import 'package:better_login/auth.dart';
import 'package:better_login/login_screen.dart';
import 'package:better_login/login_screen_presenter.dart';
import 'package:better_login/auth_provider.dart';

class HomeScreen extends StatelessWidget {
  HomeScreen({this.authStateListener, this.authStateProvider});
  final AuthStateListener authStateListener;
  final AuthStateProvider authStateProvider;

  void _signOut() async {
    try{
       authStateProvider.notify(AuthState.LOGGED_OUT);
       authStateListener.onAuthStateChanged(AuthState.LOGGED_OUT);
    }catch(e){
      print(e);
    }
  }


  @override
  Widget build(BuildContext context) {
     // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Home"),
        actions: <Widget>[
      new IconButton(icon: new Icon(Icons.exit_to_app), onPressed:   (){_signOut();}),
        ],
      ),
      body: new Center(
        child: new Text("Welcome home!"),
      ),
    );
  }

}

标签: flutterdart

解决方案


推荐阅读