Android 当用户在flatter中更改操作系统主题时,如何获得通知?
每当用户更改操作系统的主题时,我都试图得到通知。我想使用提供程序来实现这一点,但dart提供程序需要一个流,在某些内容发生更改或更新时提供快照。因此,我需要部署,或者更确切地说,使用一个流,每当操作系统主题发生变化时,它都会给我一个快照 这是我的密码。没什么特别的。但我真的很想知道如何让这个提供者启动并使用流运行Android 当用户在flatter中更改操作系统主题时,如何获得通知?,android,flutter,dart,stream,provider,Android,Flutter,Dart,Stream,Provider,每当用户更改操作系统的主题时,我都试图得到通知。我想使用提供程序来实现这一点,但dart提供程序需要一个流,在某些内容发生更改或更新时提供快照。因此,我需要部署,或者更确切地说,使用一个流,每当操作系统主题发生变化时,它都会给我一个快照 这是我的密码。没什么特别的。但我真的很想知道如何让这个提供者启动并使用流运行 import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main(
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(),
);
}
}
class主页扩展StatefulWidget{
@凌驾
_MainPageState createState()=>\u MainPageState();
}
类_MainPageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回StreamProvider.value(
初始数据:亮度.light,
值:brightnessStream,
孩子:家(),
);
}
}
在这节课上,每当亮度发生变化时,我都会收听流,并显示显示当前主题的文本
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()),
),
);
}
}
class Home扩展StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
@凌驾
小部件构建(构建上下文){
最终亮度=提供方(上下文);
返回脚手架(
背景颜色:Colors.white,
appBar:appBar(
标题:文本(“应用程序”),
),
正文:中(
子项:文本(亮度.toString()),
),
);
}
}
小溪应该像这样
Stream<Brightness> get brightnessStream {
// return stream of os brigtness (os theme)
}
Stream获取brightnessStream{
//操作系统Brigtess的返回流(操作系统主题)
}
那么这是怎么可能的呢?以下是如何为明暗模式设置不同的颜色,如果手机设置为暗模式或亮模式,应用程序将自动切换
MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
// additional settings go here
),
);
您还可以使用获取平台亮度(brighty.light/brighty.dark)
但是您必须使用WidgetsBindingObserver
mixin并重写下面的方法
@override
void didChangePlatformBrightness() {
print(WidgetsBinding.instance.window.platformBrightness); // should print Brightness.light / Brightness.dark when you switch
super.didChangePlatformBrightness(); // make sure you call this
}
然后在didChangePlatformBrightness
中,您可以添加到流中
这也是重复的。
查看谢谢您的回答。我这样解决了这个问题:
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;
}
类主题{
final window=WidgetsBinding.instance.window;
最终_controller=StreamController();
主题(){
window.onPlatformBrightnessChanged=(){
//每次亮度更改时都会调用此回调
最终亮度=窗口。平台亮度;
_控制器。接收器。添加(亮度);
};
}
Stream get Stream=>\u controller.Stream;
}
所以我建立了自己的流谢谢你的回答
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;
}