黑暗的主题贯穿整个应用程序

问题描述 投票:0回答:2

我正在制作一个我希望在开关上使用深色主题的应用程序。我已经编写了代码,并且可以正常工作,但仅适用于一页。当我返回并再次打开该页面时,它显示“错误状态错误” 。当我搜索stackoverflow时,许多建议使用共享首选项。但是我无法实现它。

CODE

    class Settings extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    // TODO: implement build
    return StreamBuilder(

      stream: bloc.darkThemeEnabled,
      initialData: false,
      builder: (context,snapshot) => MaterialApp(
        debugShowCheckedModeBanner: false ,
        theme: snapshot.data?ThemeData.dark():ThemeData.light(),
        home: HomePage(snapshot.data),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
 final bool darkThemeEnabled;

  HomePage(this.darkThemeEnabled);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(

        title: Text('Settings'),
      ),
      body: ListView(
        children: <Widget>[
          ListTile(
              title: Text("Dark Theme",style:
              TextStyle(
                  fontSize: 20.0
              ),),
              trailing: Switch(
                value: darkThemeEnabled,
                onChanged:bloc.changeTheme,
              )
          )],
      ),
    );
  }
}


class Bloc{
  final _themecontroller = StreamController<bool>();
  get changeTheme => _themecontroller.sink.add;
  get darkThemeEnabled => _themecontroller.stream;

}

final bloc = Bloc();
flutter flutter-layout
2个回答
0
投票

添加共享偏好设置:

shared_preferences: ^0.5.4+8添加到您的pubspec.yaml

import'package:shared_preferences / shared_preferences.dart';在您的班级

存储呼叫

final prefs = await SharedPreferences.getInstance();
prefs.setString(key, value);

阅读通话

final prefs = await SharedPreferences.getInstance();
var value = prefs.getString(key);

删除通话

final prefs = await SharedPreferences.getInstance();
prefs.remove(key);

key是该值的键,而value是您要存储的值在您的实例中,您可以使用key == themevalue ==dark/ light


0
投票

DartPad上的示例

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ThemeMode _themeMode = ThemeMode.light;

  _handleThemeModeChanged(ThemeMode mode) {
    setState(() {
      _themeMode = mode;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      themeMode: _themeMode,
      debugShowCheckedModeBanner: false,
      home: HomePage(
          themeMode: _themeMode, onThemeModeChanged: _handleThemeModeChanged),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key key, this.themeMode, this.onThemeModeChanged})
      : super(key: key);

  final ThemeMode themeMode;
  final ThemeModeChanged onThemeModeChanged;

  onSwitch(bool value) {
    final newThemeMode = value ? ThemeMode.dark : ThemeMode.light;

    onThemeModeChanged(newThemeMode);
  }

  @override
  Widget build(BuildContext context) {
    final isDarkMode = themeMode == ThemeMode.dark;

    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: ListView(
        children: <Widget>[
          ListTile(
              title: Text(
                "Dark Theme",
                style: TextStyle(fontSize: 20.0),
              ),
              trailing: Switch(value: isDarkMode, onChanged: onSwitch))
        ],
      ),
    );
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.