如何解决如何在颤振中使字符串成为全局变量
我创建了SharedPreferences来保存登录页面中的用户负载。然后,用户数据将保存在SharedPreferences中并移至主页。但是我现在的问题在主页中,我需要在主页的不同位置使用此变量。但是我做不到。
我需要使logindata的变量可以在我尝试在抽屉中用于注销的主页的每个位置使用。不,我收到以下错误消息:
Undefined name 'logindata'.
这是我的代码:
void initial() async {
logindata = await SharedPreferences.getInstance();
setState(() {
username = logindata.getString('username');
return username;
});
}
我的完整代码:
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'addnewtopics.dart';
import 'DetilesOfMainPage.dart';
import 'loginpage.dart';
class MyApp extends StatelessWidget {
final String email;
MyApp({Key key,@required this.email}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('JSON ListView')
),drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,children: <Widget>[
DrawerHeader(
child: Text('Drawer Header'),decoration: BoxDecoration(
color: Colors.blue,),ListTile(
title: Text('Item 1'),onTap: () {
logindata.setBool('login',true);// here I need to use It ========================
Navigator.pushReplacement(context,new MaterialPageRoute(builder: (context) => LoginUser()));
Navigator.pop(context);
},ListTile(
title: Text('Item 2'),onTap: () {
// Navigator.pop(context);
},],body: JsonImageList(),floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.push(context,MaterialPageRoute(builder: (context) => UploadImageDemo()
),);
},child: Icon(Icons.add),));
}
}
class Flowerdata {
int id;
String flowerName;
String flowerImageURL;
Flowerdata({
this.id,this.flowerName,this.flowerImageURL
});
factory Flowerdata.fromJson(Map<String,dynamic> json) {
return Flowerdata(
id: json['id'],flowerName: json['nametopics'],flowerImageURL: json['image']
);
}
}
class JsonImageList extends StatefulWidget {
JsonImageListWidget createState() => JsonImageListWidget();
}
class JsonImageListWidget extends State {
SharedPreferences logindata;
String username;
@override
void initState() {
// TODO: implement initState
super.initState();
initial();
}
void initial() async {
logindata = await SharedPreferences.getInstance();
setState(() {
username = logindata.getString('username');
return username;
});
}
final String apiURL = 'http://xxxxxxxxx/getFlowersList.php';
Future<List<Flowerdata>> fetchFlowers() async {
var response = await http.get(apiURL);
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String,dynamic>>();
List<Flowerdata> listOfFruits = items.map<Flowerdata>((json) {
return Flowerdata.fromJson(json);
}).toList();
return listOfFruits;
}
else {
throw Exception('Failed to load data from Server.');
}
}
getItemAndNavigate(String item,BuildContext context){
Navigator.push(
context,MaterialPageRoute(
builder: (context) => SecondScreen(itemHolder : item)
)
);
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Flowerdata>>(
future: fetchFlowers(),builder: (context,snapshot) {
if (!snapshot.hasData) return Center(
child: CircularProgressIndicator()
);
return ListView(
children: snapshot.data
.map((data) => Column(children: <Widget>[
GestureDetector(
onTap: ()=>{
getItemAndNavigate(data.flowerName,context)
},child: Row(
children: [
Container(
width: 200,height: 100,margin: EdgeInsets.fromLTRB(10,10,0),child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),child:
Image.network(data.flowerImageURL,width: 200,fit: BoxFit.cover,))),Flexible(child:
Text(data.flowerName,style: TextStyle(fontSize: 18)))
]),Divider(color: Colors.black),))
.toList(),);
},);
}
}
有人知道怎么做吗?
解决方法
您只需要将变量放在任何类或方法之外。一个示例是创建文件globals.dart
,然后将所有全局变量放入其中,并在需要时导入文件。
示例
// globals.dart
String globalString;
int globalInt;
bool globalBool;
// in any other file
import 'globals.dart' as globals;
globals.globalString = "Global String";
,
您需要var
关键字,在这种情况下,您可以直接使用
var logindata = await SharedPreferences.getInstance();
您不需要将其设置为全局,因为SharedPreferences.getInstance()
是Singleton
每次使用var logindata = await SharedPreferences.getInstance();
都将获得相同的实例
调用getInstance()
时也没有性能问题,因为它已被缓存,您可以在下面看到源代码片段
class SharedPreferences {
SharedPreferences._(this._preferenceCache);
...
static Future<SharedPreferences> getInstance() async {
if (_completer == null) {
_completer = Completer<SharedPreferences>();
try {
final Map<String,Object> preferencesMap =
await _getSharedPreferencesMap();
_completer.complete(SharedPreferences._(preferencesMap));
} on Exception catch (e) {
// If there's an error,explicitly return the future with an error.
// then set the completer to null so we can retry.
_completer.completeError(e);
final Future<SharedPreferences> sharedPrefsFuture = _completer.future;
_completer = null;
return sharedPrefsFuture;
}
}
return _completer.future;
当您在类外声明String
且在变量名称(如_
之类的变量名称之前不包含_localString
时,它将成为全局变量
String globalString = ""; //global,import can be seen
String _localString = ""; //local and can only be seen in this file,import can not seen
void main() async{
var logindata = await SharedPreferences.getInstance();
runApp(MyApp());
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。