我有一个应用程序,无法通过单击FAB在ListView上添加新项目。 但是我希望Fab和MetarialApp的主体在其他类别中。我不想将它们粉碎成一个。
我正在尝试使用Notification更改Stateful小部件中ListView的子代数。但这不起作用。
如何与不同的小部件通信(例如通过单击fab将项目添加到ListView小部件)?
什么是最好的方法?我听说过全局密钥,但是我不了解如何使用它们。
main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
var list = MyList();
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: Text("My App")),
body: list,
floatingActionButton: FloatingActionButton(
onPressed: () {
MyNotification(count: 1).dispatch(context);
},
child: Icon(Icons.add)),
),
theme: ThemeData(primarySwatch: Colors.green),
);
}
}
class MyList extends StatefulWidget {
@override
State<StatefulWidget> createState() => ListState();
}
class ListState extends State {
int count = 3;
@override
Widget build(BuildContext context) {
return NotificationListener<MyNotification>(
onNotification: onCountPush,
child: ListView.builder(
itemCount: count,
itemBuilder: (BuildContext context, int index) {
return BodyCard();
}),
);
}
bool onCountPush(MyNotification notify) {
setState(() {
count += notify.count;
});
return true;
}
}
class MyNotification extends Notification {
final int count;
const MyNotification({this.count});
}
答案 0 :(得分:0)
body
和FAB
是Scaffold
的属性。因此,当您尝试从body
控制FAB
的状态时,应该处理的不是body
而是Scaffold
本身。您看,Scaffold
扩展了StatefulWidget
,另一方面,MyList
扩展了StatelessWidget
。希望你明白我的意思。
main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: MyScaffold(),
theme: ThemeData(primarySwatch: Colors.green),
);
}
}
class MyScaffold extends StatefulWidget {
@override
State<StatefulWidget> createState() => MyScaffoldState();
}
class MyScaffoldState extends State {
int count = 3;
void changeCount() {
setState(() {
count = count == 3 ? 5 : 3;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("My App")),
body: MyList(count),
floatingActionButton: FloatingActionButton(
onPressed: changeCount,
child: Icon(Icons.add),
),
);
}
}
class MyList extends StatelessWidget {
final int count;
const MyList(this.count);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: count,
itemBuilder: (BuildContext context, int index) {
return Container(
margin: const EdgeInsets.all(10),
height: 30,
color: Colors.red,
);
},
);
}
}
注意:
稍后,当您的状态变得更加复杂时,您就不想坚持使用setState
来管理状态。就像其他人所说的,您可以学习BLoC,ChangeNotifier或任何适合您的内容。
答案 1 :(得分:-1)
您应该在代码中使用Provider或BLoc,以便做到这一点