当用户在flutter中更改操作系统主题时,如何获得通知



每当用户更改操作系统的主题时,我都会尝试得到通知。我想使用Provider来实现这一点,然而,当服务器的某些内容发生更改或更新时,dart Provider需要一个提供快照的Stream。所以我需要emplement,或者更确切地说,使用Stream,每当os主题发生变化时,它都会给我一个快照。

这是我的密码。没什么特别的。但我真的很想知道如何让这个提供商启动并运行流

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MaterialApp(initialRoute: '/', routes: {
'/': (context) => MainPage(),
}));

这个类是主页的包装器。它包含提供程序。(value:brightnessStream(是一个伪值,这就是我需要实现的。

class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
@override
Widget build(BuildContext context) {
return StreamProvider<Brightness>.value(
initialData: Brightness.light,
value: brightnessStream,
child: Home(), 
);
}
}

在这节课上,每当亮度变化并显示当前主题的文本时,我都会听Stream。

class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
final brightness = Provider.of<Brightness>(context); 
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
title: Text('App'),
),
body: Center(
child: Text(brightness.toString()),
),
);
}
}

小溪应该喜欢这样的东西。

Stream<Brightness> get brightnessStream {
// return stream of os brigtness (os theme)
}

那么这怎么可能呢?

以下是如何为亮模式和暗模式设置不同的颜色,如果手机设置为暗模式或亮模式,应用程序将自动切换。

MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
// additional settings go here
),
);

您还可以使用获得平台亮度(brightness.light/Brightnest.dark(

WidgetsBinding.instance.window.platformBrightness

但是您必须使用WidgetsBindingObservermixin并覆盖下面的方法

@override
void didChangePlatformBrightness() {
print(WidgetsBinding.instance.window.platformBrightness); // should print Brightness.light / Brightness.dark when you switch
super.didChangePlatformBrightness(); // make sure you call this
}

然后在CCD_ 2中,您可以将其添加到流中。

这也是重复的。单击此处查看

感谢您的回答。我解决了这样的问题:

class Theme {
final window = WidgetsBinding.instance.window;
final _controller = StreamController<Brightness>();
Theme() {
window.onPlatformBrightnessChanged = () {
// This callback gets invoked every time brightness changes
final brightness = window.platformBrightness;
_controller.sink.add(brightness);
};
}
Stream<Brightness> get stream => _controller.stream;
}

所以我建立了自己的流

最新更新