Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 保存主题(颤振/飞镖)_Flutter_Dart_Save_Themes - Fatal编程技术网

Flutter 保存主题(颤振/飞镖)

Flutter 保存主题(颤振/飞镖),flutter,dart,save,themes,Flutter,Dart,Save,Themes,早上好, 这里我有两个按钮可以改变我的应用程序的主题(亮和暗)。重新加载应用程序时,主题不是我上次选择的主题。我希望应用程序备份本地使用的最后一个主题。您可能只需要保存一个数字,以指示上一个主题使用了哪个主题。但我根本不知道怎么做 代码如下:main.dart import 'package:flutter/material.dart'; import 'package:animated_splash_screen/animated_splash_screen.dart'; import 'pa

早上好, 这里我有两个按钮可以改变我的应用程序的主题(亮和暗)。重新加载应用程序时,主题不是我上次选择的主题。我希望应用程序备份本地使用的最后一个主题。您可能只需要保存一个数字,以指示上一个主题使用了哪个主题。但我根本不知道怎么做

代码如下:main.dart

import 'package:flutter/material.dart';
import 'package:animated_splash_screen/animated_splash_screen.dart';
import 'package:watch/nav.dart';
import 'package:page_transition/page_transition.dart';

import 'package:watch/blocs/theme.dart';
import 'package:provider/provider.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ThemeChanger>(
      builder: (_) => ThemeChanger(ThemeData.dark()),
      child: MaterialAppWithTheme(),
    );
  }
}

class MaterialAppWithTheme extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final theme = Provider.of<ThemeChanger>(context);
    return MaterialApp(
    debugShowCheckedModeBanner: false,
    theme: theme.getTheme(),

    home: AnimatedSplashScreen(
      duration: 3000,
        splash: "",
        splashTransition: SplashTransition.slideTransition,
        pageTransitionType: PageTransitionType.downToUp,
        nextScreen: Nav(),
    ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:animated_splash_screen/animated_splash_screen.dart”;
进口“包装:手表/导航镖”;
导入“package:page_transition/page_transition.dart”;
导入“package:watch/blocs/theme.dart”;
导入“包:provider/provider.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
生成器:()=>themechance(ThemeData.dark()),
子项:MaterialAppWithTheme(),
);
}
}
类MaterialAppWithTheme扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终主题=提供者(上下文);
返回材料PP(
debugShowCheckedModeBanner:false,
theme:theme.getTheme(),
主页:动画SplashScreen(
时长:3000,
飞溅:“,
splashTransition:splashTransition.slideTransition,
pageTransitionType:pageTransitionType.downToUp,
nextScreen:Nav(),
),
);
}
}
设置。省道

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:watch/blocs/theme.dart';
import 'package:watch/constants.dart';

class Parametres extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ThemeChanger _themeChanger = Provider.of<ThemeChanger>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Paramètres', style: kAppBarStyle,), 
        elevation: 0,
        automaticallyImplyLeading: false,
        leading: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Icon(
            Icons.arrow_back,
          ),
        ),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            FlatButton(
              onPressed: () => _themeChanger.setTheme(
                ThemeData(                 
                  bottomNavigationBarTheme: bNavBar,
                  scaffoldBackgroundColor: kBlackMedium,
                  brightness: Brightness.dark,
                  iconTheme: bIcons,
                )), 
              child: Text('Dark Theme')),
            FlatButton(
              onPressed: () => _themeChanger.setTheme(
                ThemeData(
                  bottomNavigationBarTheme: lNavBar,
                  scaffoldBackgroundColor: Colors.white,
                  brightness: Brightness.light,
                  iconTheme: lIcons,
                  primaryColor: kWhite,
                )), 
              child: Text('Light Theme')),
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“package:watch/blocs/theme.dart”;
导入“package:watch/constants.dart”;
类参数扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
ThemeChanger _ThemeChanger=Provider.of(上下文);
返回脚手架(
appBar:appBar(
标题:文本('Paramètres',样式:kAppBarStyle,),
海拔:0,
自动嵌入:false,
引导:手势检测器(
onTap:(){
Navigator.pop(上下文);
},
子:图标(
Icons.arrow_back,
),
),
),
主体:容器(
子:列(
儿童:[
扁平按钮(
按下时:()=>\u themechance.setTheme(
主题数据(
底部导航Bartheme:bNavBar,
脚手架背景颜色:kBlackMedium,
亮度:亮度。暗,
iconTheme:bIcons,
)), 
子:文本(“黑色主题”),
扁平按钮(
按下时:()=>\u themechance.setTheme(
主题数据(
底部导航Bartheme:lNavBar,
脚手架背景颜色:颜色。白色,
亮度:亮度,亮度,
iconTheme:lIcons,
原色:kWhite,
)), 
子项:文本(“灯光主题”),
],
),
),
);
}
}

谢谢您使用,您可以将简单值存储为密钥对值。将该数据加载到初始屏幕的init中,以便您可以根据主题显示屏幕。您应该使用本地内存保存主题

您可以使用共享首选项蜂巢db或sqflite或其他数据库系统

关于更改主题,您可以使用Cubit、Bloc、Provider等,甚至ValueNotifier。

但是,您应该用“您的状态管理小部件”包装MaterialApp或CupertinoApp

再加上一些逻辑

或者你可以使用一些图书馆
共享首选项是最佳选择。因为我不知道你的主题课,我先在这里添加我的主题课:

class MyThemeModel extends ChangeNotifier{
  ThemeData _themedata;

  MyThemeModel(bool isActive){
    if(isActive == null){
      getThemeData;
    }
    else{
      if(isActive){
        _themedata = sleepTheme;
      }
      else{
        _themedata = morningTheme;
      }
    }

  }

  ThemeData get getThemeData => _themedata;

  void setThemeData(ThemeData data){
    _themedata = data;
    notifyListeners();
  }
}
在main.dart中

void main() async{
  var isSleepActive;
  if(SharedPrefHelper.prefInstance.checkContains(SharedPrefKeys.ISMORNING)){
    isSleepActive = SharedPrefHelper.prefInstance.getBool(SharedPrefKeys.ISMORNING);
  }
  else{
    isSleepActive = false;
  }
  runApp(MultiProvider(
      providers: [
        ChangeNotifierProvider(
          builder: (context) => MyThemeModel(isSleepActive),
        )
      ],
    child: MyApp(),
    )
  );
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: Provider.of<MyThemeModel>(context).getThemeData,
      title: 'Theme App',
      home: AnimatedSplashScreen(
       duration: 3000,
       splash: "",
       splashTransition: SplashTransition.slideTransition,
       pageTransitionType: PageTransitionType.downToUp,
       nextScreen: Nav(),
),
      debugShowCheckedModeBanner: false,
    );
  }

您可以使用共享首选项来存储键值对数据。例如:isDark(键)-真/假(值)
FlatButton(
              onPressed: () => myThemeModel.setThemeData(
                ThemeData(
                  bottomNavigationBarTheme: lNavBar,
                  scaffoldBackgroundColor: Colors.white,
                  brightness: Brightness.light,
                  iconTheme: lIcons,
                  primaryColor: kWhite,
                )), 
              child: Text('Light Theme')),