Как получить доступ к одному методу класса из другого класса в дартс? - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в дартс. В настоящее время работаю над мобильным приложением через флаттер. У меня есть класс 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 и пытаюсь получить к нему доступ 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ünter Zö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;
  }

}

Теперь, пытаясь получить доступ к этому getUserDetailsFromSharedPreference() методу, я получаю ту же ошибку Only static memebers can be accessed in initializers.

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Чтобы получить доступ к другому методу класса, вы можете просто поставить static на метод.

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


void main() {
  Helper.printing('Hello World!');
} 
0 голосов
/ 08 мая 2018

Вы можете обеспечить одноэлементный экземпляр класса, используя общедоступный конструктор фабрики с частным обычным конструктором:

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

  Helper._();

  ...
}

Если вы позвоните new Helper(), вы всегда получите один и тот же экземпляр.

Вам необходимо импортировать файл, содержащий class Helper {} везде, где вы хотите его использовать.

??= означает, что new Helper._() выполняется только тогда, когда _instance равно null, и если оно выполнено, результат будет присвоен _instance до того, как он будет возвращен вызывающей стороне.

обновление

getUserDetailsFromSharedPreference - это async, и поэтому его нельзя использовать так, как вы его используете, по крайней мере, это не приведет к ожидаемому результату. 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...