如何解决每当用户在 flutter 中更改 os 主题时如何得到通知?
每当用户更改操作系统的主题时,我都会尝试收到通知。我想使用 Provider 来实现这一点,但是 dart Provider 需要一个 Stream 来提供快照,无论何时更改或更新。所以我需要实现或者更确切地说使用一个 Stream,它会在 os 主题改变时给我一个快照。
这是我的代码。这没什么特别的。但我真的很想知道如何使用 Stream 启动并运行这个 Provider
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MaterialApp(initialRoute: '/',routes: {
'/': (context) => MainPage(),}));
这个类是 HomePage 的包装器。它包含提供者。 (value: BrightStream) 是一个虚拟值,这就是我需要实现的。
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 / Brightness.dark)WidgetsBinding.instance.window.platformBrightness
但是您必须使用 WidgetsBindingObserver
混合并覆盖下面的方法
@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
内,您可以添加到您的信息流中。
这也是重复的。 click here 查看
,感谢您的回答。我解决了这个问题:
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;
}
所以我建立了自己的流
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。