【问题标题】:how to get notified whenever the user changes the os theme in flutter?每当用户在颤动中更改操作系统主题时如何获得通知?
【发布时间】:2021-07-08 00:02:18
【问题描述】:

每当用户更改操作系统的主题时,我都会尝试获得通知。我想使用 Provider 来实现这一点,但是 dart Provider 需要一个提供快照的流,无论何时更改或更新。所以我需要实现或者更确切地说是使用一个 Stream,只要操作系统主题发生变化,它就会给我一个快照。

这是我的代码。这没什么特别的。但我真的很想知道如何让这个 Provider 启动并使用 Stream 运行

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(MaterialApp(initialRoute: '/', routes: {
      '/': (context) => MainPage(),
    }));

这个类是 HomePage 的包装器。它包含提供者。 (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)
}

那怎么可能呢?

【问题讨论】:

    标签: android flutter dart stream provider


    【解决方案1】:

    这里介绍了如何为明暗模式设置不同的颜色,如果手机设置为暗模式或亮模式,应用程序会自动切换。

    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 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 中添加到您的信息流中。

    这也是重复的。 click here查看

    【讨论】:

      【解决方案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;
      }
      

      所以我建立了自己的流

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多