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

时间:2018-05-08 07:30:19

标签: 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;
  }

}

这是我的主程序代码,其中包含了Helper类和&amp;试图访问它的getUserDetailsFromSharedPreference ()。在这种情况下,我收到类似Only static memebers can be accessed in initializers的错误。我还尝试在extends课程中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();
}

@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

enter image description here

3 个答案:

答案 0 :(得分:5)

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

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

  Helper._();

  ...
}

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

您需要在任何地方导入包含class Helper {}的文件。

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

<强>更新

getUserDetailsFromSharedPreferenceasync,因此不能以您使用它的方式使用,至少它不会导致预期的结果。 getUserDetailsFromSharedPreference会返回FutureFuture会在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); } 来获取结果。

$.each($('.single-price .price'), function(){...}

答案 1 :(得分:1)

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

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


void main() {
  Helper.printing('Hello World!');
} 

答案 2 :(得分:-1)

我认为这个问题与访问另一个类中的一个类数据更相关。所以我根据我对问题的理解进行了解释,但如果我不正确的话。

但是如果你想访问A类的数据,不是直接而是通过B类。 所以首先你必须在 B 类中创建一个 A 的对象,但记住一件事,你必须使对象成为静态的,以便在 B 类中访问 A 类的数据

如果你仍然对这一切感到困惑,我制作了一个解决方案视频。 看看:https://youtu.be/shK7ZraruCI