我有一个包含网页浏览量的主屏幕。该网页浏览量包含三个孩子,每个孩子都是一个单独的类:
children: <Widget>[
FirstScreen(),
SecondScreen(),
ThirdScreen(),
这些屏幕从数据库加载数据,并且是StatefulWidgets。我从主屏幕上打开的单独屏幕中向该数据库添加数据。
将数据添加到数据库后,我想为这三个屏幕触发setState
方法。
当它们处于不同的班级时,如何访问这些屏幕?
答案 0 :(得分:1)
您正在寻找的是状态管理。
有多种可能性可以确保业务逻辑/存储和小部件之间的通信。
https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
我可以推荐BLoC和BlocProvider用于状态管理。简而言之,它使您的小部件可以对特定事件做出反应,在应用中声明状态并从视图中分离业务逻辑。
答案 1 :(得分:0)
我添加了这个以显示示例,请为您的数据库修改它!
主屏幕
class MainScreen extends StatefulWidget {
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
List<Map> list = [];
@override
void initState() {
super.initState();
list.add({'name': 'Raj', 'phone': '1234567890'});
list.add(
{'name': 'Naveen', 'phone': '1122334455'},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: Text('Main Screen', style: TextStyle(color: Colors.white)),
actions: [
IconButton(
icon: Icon(Icons.add_circle, color: Colors.white),
onPressed: () {
addNewItem();
})
]),
body: Container(
padding:EdgeInsets.all(15),
color: Colors.white,
child: Center(
child: ListView.builder(
itemCount: list.length,
itemBuilder: (con, ind) {
return ListTile(
title: Text(list[ind]['name'],
style: TextStyle(color: Colors.black)),
subtitle: Text(list[ind]['phone'],
style: TextStyle(color: Colors.black)));
}),
)),
);
}
void addNewItem() async {
Map newItem = await Navigator.push(
context, MaterialPageRoute(builder: (cc) => NewScreen()));
if (newItem != null) {
setState(() {
list.add(newItem);
});
}
}
}
class NewScreen extends StatefulWidget {
@override
_NewScreenState createState() => _NewScreenState();
}
class _NewScreenState extends State<NewScreen> {
//Declare your new item here....
Map newItem;
//I m using strigns, but use TextEditingControllers here...
String name = '', phone = '';
@override
void initState() {
super.initState();
//database initialisation...
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: onBackPressed,
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: Text('New Screen', style: TextStyle(color: Colors.white)),),
body: Container(
padding:EdgeInsets.all(15),
color:Colors.white,
child: Center(
child: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Name',
labelStyle: TextStyle(color: Colors.black)),
onChanged: (v) {
setState(() {
name = v;
});
},
style: TextStyle(color: Colors.black)),
TextField(
decoration: InputDecoration(labelText: 'Phone',
labelStyle: TextStyle(color: Colors.black)),
onChanged: (v) {
setState(() {
phone = v;
});
},
style: TextStyle(color: Colors.black)),
RaisedButton(
child: Text('Add'),
onPressed: () {
if (name.isNotEmpty && phone.isNotEmpty) {
newItem = Map();
newItem['name'] = name;
newItem['phone'] = phone;
//You may close new screen if you want !
//But call sendNewItemBack();
}
})
],
))),
),
);
}
Future<bool> onBackPressed() async {
sendNewItemBack();
}
sendNewItemBack() {
//add new item to database
Navigator.of(context).pop(newItem);
}
}
添加后