【发布时间】:2021-07-16 06:27:14
【问题描述】:
我还不太熟悉 Flutter 和编码。我在这里也很新,所以对于我在发布问题时可能犯的任何错误,我深表歉意。此外,如果需要,我使用 android studio。
为了更具描述性,我想使用 sharedPreferences 将从 1stScreen 的 4 个 Textfields 获取的数据保存为数组,并将它们添加到 2ndScreen 的列表中。尚无任何内容的列表,如果保存了第一个屏幕的数据,则列表显示包含已保存数据的 1 项。
这是我乱七八糟的代码:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
class ListProvider extends ChangeNotifier {
List<String> litems = List<String>();
List<String> get Items =>
this.litems;
set logList(List<String> value) {
litems = value;
notifyListeners();
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with ChangeNotifier {
TextEditingController firstname = TextEditingController();
TextEditingController lastname = TextEditingController();
TextEditingController birthday = TextEditingController();
TextEditingController address = TextEditingController();
//
String data = "";
String data1 = "";
String data2 = "";
String data3 = "";
String firstname1 = "f";
String lastname1 = "l";
String birthday1 = "";
String address1 = "";
Future<bool>saveData() async{
SharedPreferences preferences = await SharedPreferences.getInstance();
return await preferences.setString(firstname1, firstname.text);
}
Future<bool>saveData1() async{
SharedPreferences preferences1 = await SharedPreferences.getInstance();
return await preferences1.setString(lastname1, lastname.text);
}
Future<bool>saveData2() async{
SharedPreferences preferences = await SharedPreferences.getInstance();
return await preferences.setString(birthday1, birthday.text);
}
Future<bool>saveData3() async{
SharedPreferences preferences1 = await SharedPreferences.getInstance();
return await preferences1.setString(address1, address.text);
}
///////////
Future<String> loadData() async{
SharedPreferences preferences = await SharedPreferences.getInstance();
return preferences.getString(firstname1);
}
Future<String> loadData1() async{
SharedPreferences preferences2 = await SharedPreferences.getInstance();
return preferences2.getString(lastname1);
}
Future<String> loadData2() async{
SharedPreferences preferences = await SharedPreferences.getInstance();
return preferences.getString(birthday1);
}
Future<String> loadData3() async{
SharedPreferences preferences2 = await SharedPreferences.getInstance();
return preferences2.getString(address1);
}
setData(){
loadData().then((value){
setState(() {
data = value;
});
});
}
setData1(){
loadData1().then((value){
setState(() {
data1 = value;
});
});
}
setData2(){
loadData2().then((value){
setState(() {
data2 = value;
});
});
}
setData3(){
loadData3().then((value){
setState(() {
data3 = value;
});
});
}
add(screen2){
screen2.litems.add(data);
notifyListeners();
setState(() {
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
TextField(
controller: firstname,
decoration: InputDecoration(
hintText: "FIRST NAME"
),
),
TextField(
controller: lastname,
decoration: InputDecoration(
hintText: "LAST NAME"
),
),
TextField(
controller: birthday,
decoration: InputDecoration(
hintText: "BIRTHDAY"
),
),
TextField(
controller: address,
decoration: InputDecoration(
hintText: "ADDRESS"
),
),
RaisedButton(
onPressed: (){
saveData();
saveData1();
saveData2();
saveData3();
setData();
setData1();
setData2();
setData3();
add(screen2());
},
child: Text("ADD"),
),
RaisedButton(
onPressed: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) => screen2()),
);
},
child: Text("SHOW ALL"),
),
],
),
),
);
}
}
这是我需要从中访问列表的第二个屏幕。
代码 sn-p 取自 this
class screen2 extends StatefulWidget {
@override
State createState() => new DyanmicList();
}
class DyanmicList extends State<screen2> with ChangeNotifier {
List<String> litems = [];
final TextEditingController eCtrl = new TextEditingController();
@override
Widget build (BuildContext ctxt) {
return new Scaffold(
appBar: new AppBar(title: new Text("Screen2"),),
body: new Column(
children: <Widget>[
new TextField(
controller: eCtrl,
onSubmitted: (text) {
litems.add(text);
eCtrl.clear();
setState(() {});
},
),
new Expanded(
child: new ListView.builder
(
itemCount: litems.length,
itemBuilder: (BuildContext ctxt, int Index) {
return new Text(litems[Index]);
}
)
)
],
)
);
}
}
【问题讨论】:
-
另外,我应该清理那个 Provider 代码吗?或者如果我使用它会更短吗?
-
我建议你将这4个数据存储在一个列表中并存储到
sharedPreferences。然后在第二页从sharedPreferences检索列表。 -
感谢@JohnJoe 的回复!好的,所以我会这样做,但是否可以只有一个函数来存储所有 4 个数据?如果你不介意我问一个简单的问题,这是否意味着我将有 1 个列表用于在 1stScreen 中存储 4 个数据,而在 2ndScreen 中还有另一个列表用于显示我从 1stScreen 收到的数据?
-
完全正确。我在下面提供了我的答案,希望对您有意义。
标签: arrays flutter listview dart sharedpreferences