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

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(

每当用户更改操作系统的主题时,我都试图得到通知。我想使用提供程序来实现这一点,但dart提供程序需要一个流,在某些内容发生更改或更新时提供快照。因此,我需要部署,或者更确切地说,使用一个流,每当操作系统主题发生变化时,它都会给我一个快照

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

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;
}