颤振:从晶圆厂更改车身状态

时间:2020-04-26 19:30:03

标签: android flutter dart

我有一个应用程序,无法通过单击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});
}

2 个答案:

答案 0 :(得分:0)

bodyFABScaffold的属性。因此,当您尝试从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,以便做到这一点