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

Sur*_*esh 3 dart flutter

我是飞镖新手。当前,正在通过扑动来开发移动应用程序。我有一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;
  }

}
Run Code Online (Sandbox Code Playgroud)

这是我的主程序代码,其中包含Helper类并尝试访问它getUserDetailsFromSharedPreference ()。在这种情况下,我收到类似的错误Only static memebers can be accessed in initializers。我也在extends课堂上尝试了Helper UserProfile课。但是,我也遇到了另一种错误。无法识别如何执行此操作。

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();
}
Run Code Online (Sandbox Code Playgroud)

@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;
  }

}
Run Code Online (Sandbox Code Playgroud)

现在,在我尝试访问该getUserDetailsFromSharedPreference()方法的tryint中,我遇到了同样的错误Only static memebers can be accessed in initializers

在此处输入图片说明

小智 7

要访问其他类方法,您只需放入static该方法即可。

class Helper {
  static printing(String someText){
    print(someText);
  }
}


void main() {
  Helper.printing('Hello World!');
} 
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 6

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

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

  Helper._();

  ...
}
Run Code Online (Sandbox Code Playgroud)

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

您需要导入文件,该文件包含class Helper {}要使用的所有位置。

??=new Helper._()仅在_instanceis 时执行means null,如果执行,则将结果分配给_instance它,然后将其返回给调用方。

更新

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();
}
Run Code Online (Sandbox Code Playgroud)

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

  foo() async {
    var ud = await userData;
    print(ud);
  }
Run Code Online (Sandbox Code Playgroud)