1

在我的颤振应用程序中,我有一个ConnectivityStatus小部件,它显示应用程序与我的树莓派的当前连接状态。在initState我的小部件中,我订阅了一个计时器以每 5 秒检查一次连接并相应地更新状态,然后在处理时取消订阅。

问题是,当多个屏幕使用ConnectivityStatus小部件时,例如在堆栈导航器设置中,我现在有两个并发订阅,因为两个实例都没有处理。这会导致出现许多多余的、不需要的请求。

我真正想要的是在多个屏幕上共享一个小部件实例,或者让多个实例可以访问一个全局状态。

我怎样才能做到这一点,或者我的问题有哪些其他推荐的解决方案?

4

3 回答 3

2

我建议使用 Provider 并创建一个RPIService发送连接状态流的。

class RPIService {
  var RPIstatus = ValueNotifier<Status>(Status('offline'));

RPIService(){

rpi...listen((cstatus){
RPIstatus.add(Status(cstatus));

});

}}

class Status {
final String statusMessage;
 Status(this.statusMessage);
} 

主要.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [

       Provider<UserService>(
       create: (context) => UserService(),
       lazy: false,

       ),
        StreamProvider<Status>(
          create: (context) =>
              Provider.of<RPIService>(context, listen: false).RPIstatus,
        ),
      ],
      child: MaterialApp(
        title: 'Your app',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: YourHome(),
      ),
    );
  }
}

你的家.dart

class YourHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<Status>(builder: (context, status, _) {
      return Scaffold(
        body: Text(status.status),
      );
    });
  }
}
于 2020-05-08T21:47:26.280 回答
0

实现这一点的最简单方法是使用 InheritedWidget 将 ConnectivityStatus 传递给下降的小部件。 https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html

您还可以查看其他状态管理解决方案,例如 Provider https://pub.dev/packages/provider 或 Bloc https://pub.dev/packages/flutter_bloc

于 2020-05-08T21:45:08.217 回答
0

实现此目的的另一种方法是使用GlobalKey,因为这是官方的 Flutter 在应用程序中共享单个小部件状态的方式。

在一个key.dart文件中:

final GlobalKey<ConnectivityStatusState> connectivityStatusKey = GlobalKey();

创建ConnectivityStatus小部件时:

ConnectivityStatus(
  key: connectivityStatusKey,
  ...
)

您要访问ConnectivityStatus状态的位置:

connectivityStatusKey.currentState.anythingPublicInThisState()

要使用它,请确保您的状态类是公共的(没有_)并且ConnectivityStatus小部件在小部件树中存在且唯一

希望这会有所帮助!

于 2020-05-08T22:55:33.317 回答