ダーツは初めてです。現在、フラッターを介してモバイルアプリに取り組んでいます。私が持っている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ünterZöchbauerHelper.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
。
パブリックファクトリコンストラクタとプライベートレギュラーコンストラクタを使用して、クラスのシングルトンインスタンスを確保できます。
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);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加