flutter - 如何从整个班级颤振中访问字符串
问题描述
正如您在我的代号值中看到的那样,我有一个字符串。我将数据保存为 SharedPreferences 并检索它。但是我现在的问题是如何从每个地方使用它?如何在 read() async 中访问它?我需要从抽屉小部件访问它,但现在我做不到。
如果有人知道解决方案,请帮助我
_read() async {
final prefs = await SharedPreferences.getInstance();
final key = 'my_int_key';
final value = prefs.getString(key) ?? 0;
print('read: $value');
}
class MyApp extends StatelessWidget {
final String email;
var value="";
MyApp({Key key, @required this.email}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(value)
),
drawer: Drawer(
child: ListView(
// Important: Remove any padding from the ListView.
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
child: Text(value),
decoration: BoxDecoration(
color: Colors.blue,
),
),
ListTile(
title: Text('Item 1 '),
onTap: () {
//logindata.setBool('login', true);
Navigator.push(context, MaterialPageRoute(builder: (context) => LoginUser()),);
},
),
ListTile(
title: Text('Item 2'),
onTap: () {
// Navigator.pop(context);
},
),
],
),
),
body: JsonImageList(),
floatingActionButton: FloatingActionButton(
onPressed: () {
//Navigator.push(context, MaterialPageRoute(builder: (context) => NewTopics()
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 {
var logindata = await SharedPreferences.getInstance();
// logindata = await SharedPreferences.getInstance();
setState(() {
read();
username = logindata.getString('username');
return username;
});
}
final String apiURL = 'http://192.168.42.33/getFlowersList.php';
//final String apiURL = 'http://192.168.8.106/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, 0, 10, 0),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child:
Image.network(data.flowerImageURL,
width: 200, height: 100, fit: BoxFit.cover,))),
Flexible(child:
Text(data.flowerName,
style: TextStyle(fontSize: 18)))
]),),
Divider(color: Colors.black),
],))
.toList(),
);
},
);
}
}
getItemAndNavigate(String item, BuildContext context){
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondScreen(itemHolder : item)
)
);
}
read() async {
final prefs = await SharedPreferences.getInstance();
final key = 'my_int_key';
final value = prefs.getString(key) ?? 0;
print('read: $value');
}
解决方案
做这个,
var value="";
然后,在 read() 方法中,在 setState() 中对其进行初始化,以便当它从未来获取值时,它可以反映在 UI 中。
setState((){
value = prefs.getString(key) ?? 0;
});
现在,在抽屉里,你可以使用变量的值,
DrawerHeader(
child: Text(value),
decoration: BoxDecoration(
color: Colors.blue,
),
),
更新:-
1)将您的 StateLess Widget 更改为 StateFul Widget。
2)确保在初始化值时设置状态,
setState((){
value = prefs.getString(key) ?? 0;
});
推荐阅读
- icalendar - icalendar“不支持的日历 message.ics”问题
- azure - 使用防火墙规则在存储上备份 Azure 分析服务
- arrays - 如果案例没有内容,如何忽略整个 Google 表格行?
- windows - 在 Windows 中正确设置 git 过滤器并将参数传递给它
- java - 如何计算数组中单个值的频率?
- django - 在 Django 模板中链接到 AWS S3 直接图像上传
- c# - 如何将 HTTPPostedFileBase 转换为 Google Drive API 文件
- javascript - 为什么 HTML 5 Geolocation API 不支持 Promise?
- google-drive-api - 为什么 Google Drive Listing V3 API 只显示文档的子集
- oauth-2.0 - 商家中心页面中缺少帐户