Темная тема через приложение во флаттере - PullRequest
0 голосов
/ 14 февраля 2020

Я делаю приложение, в котором я хочу иметь темную тему для приложения на коммутаторе. Я написал код и работает нормально, но только для одной страницы. Когда я go возвращаюсь и снова открываю эту страницу, отображается «ПЛОХО» ГОСУДАРСТВЕННАЯ ОШИБКА ". когда я искал в 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();

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Exampe on 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))
        ],
      ),
    );
  }
}

0 голосов
/ 14 февраля 2020

Добавление общих преференций:

добавление shared_preferences: ^0.5.4+8 в ваш pubspe c .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 == theme, value == dark / light

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...