首页 文章

如何从dart中的另一个类访问一个类方法?

提问于
浏览
2

我是飞镖的新手 . 目前,通过扑动在移动应用程序上工作 . 我有一个 Helper 类,它有一些常用的方法,我将 Helper 类包含在另一个类中 . 但是,无法无花果 . 如何访问其方法 .

我的通用 Helper 类代码:

import 'dart:async';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class Helper {

  Map userDetails = {};
  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  // --- Method for getting user details from shared preference ---
  Future<Map>getUserDetailsFromSharedPreference () async {
    try {
      final SharedPreferences prefs = await _prefs;

      if(prefs.getString('user') != null) {
        this.userDetails = json.decode(prefs.getString('user'));
      } else {
        print('Shared preference has no data');
      }

    } catch (e){
      print('Exception caught at getUserDetails method');
      print(e.toString());
    }

    return this.userDetails;
  }

}

这是我的主程序代码,其中我是've included the Helper class & trying to access it' s getUserDetailsFromSharedPreference () . 在这种情况下,我收到像 Only static memebers can be accessed in initializers 这样的错误 . 我也试过 extends 级的 extends 帮助班 . 但是,我也能够确定如何做这件事 .

import 'package:flutter/material.dart';
import 'helper.dart';

class UserProfile extends StatefulWidget {
    @override
    UserProfileState createState() => new UserProfileState();
}

class UserProfileState extends State<UserProfile> {
    Helper helper = new Helper();
    var userData = helper.getUserDetailsFromSharedPreference();
}

@GünterZöchbauer我按照你的建议制作了我的 Helper.dart 文件 -

import 'dart:async';
import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class Helper {

  Map userDetails = {};
  Future<SharedPreferences> _prefs = SharedPreferences.getInstance();

  static Helper _instance;
  factory Helper() => _instance ??= new Helper._();

  Helper._();

  // --- Method for getting user details from shared preference ---
  Future<Map>getUserDetailsFromSharedPreference () async {
    try {
      final SharedPreferences prefs = await _prefs;

      if(prefs.getString('user') != null) {
        this.userDetails = json.decode(prefs.getString('user'));
      } else {
        print('Shared preference has no data');
      }

    } catch (e){
      print('Exception caught at getUserDetails method');
      print(e.toString());
    }

    return this.userDetails;
  }

}

现在,在我的tryint访问 getUserDetailsFromSharedPreference() 方法我得到相同的错误 Only static memebers can be accessed in initializers .

2 回答

  • 3

    您可以使用具有私有常规构造函数的公共工厂构造函数来确保该类的单例实例:

    class Helper {
      static Helper _instance;
      factory Helper() => _instance ??= new Helper._();
    
      Helper._();
    
      ...
    }
    

    如果您调用 new Helper() ,您将始终获得相同的实例 .

    您需要在任何要使用它的位置导入包含 class Helper {} 的文件 .

    ??= 表示 new Helper._() 仅在 _instancenull 时执行,如果执行,则结果将在返回给调用者之前分配给 _instance .

    update

    getUserDetailsFromSharedPreferenceasync ,因此不能以您使用它的方式使用,至少它不会导致预期的结果 . getUserDetailsFromSharedPreference 返回 Future ,在 Future 完成时提供结果 .

    class UserProfileState extends State<UserProfile> {
        Helper helper = new Helper();
        Future<Map> _userData; // this with ??= of the next line is to prevent `getUserDetailsFromSharedPreference` to be called more than once 
        Future<Map> get userData => _userData ??= helper.getUserDetailsFromSharedPreference();
    }
    

    如果需要访问 userData ,则需要标记使用 async 的方法,并使用 await 获取结果 .

    foo() async {
        var ud = await userData;
        print(ud);
      }
    
  • 1

    要访问其他类方法,您只需将 static 放在方法上即可 .

    class Helper {
      static printing(String someText){
        print(someText);
      }
    }
    
    
    void main() {
      Helper.printing('Hello World!');
    }
    

相关问题