Ionic 3:动态主题切换

初始化项目
ionic start myApp blank
cd blank
ionic g provider settings 
新建主题文件

src/theme 文件夹下新建以下两个主题文件:

theme.light.scss

.light-theme {
  ion-content {
    background-color: #fff;
  }
  .toolbar-background {
    background-color: #fff;
  }
}

theme.dark.scss

.dark-theme {
  ion-content {
    background-color: #090f2f;
    color: #fff;
  }
  .toolbar-title {
    color: #fff;
  }
  .header .toolbar-background {
    border-color: #ff0fff;
    background-color: #090f2f;
  }
}

src/theme/variables.scss 文件中添加导入:

@import "theme.light";
@import "theme.dark";
Settings provider

src/providers/settings/settings.ts

import {
  Injectable
} from '@angular/core';
import {
  BehaviorSubject
} from 'rxjs/Rx';


@Injectable()
export class SettingsProvider {
  theme: BehaviorSubject < string > ;
  constructor() {
    this.theme = new BehaviorSubject('dark-theme');
  }
  setActiveTheme(val) {
    this.theme.next(val);
  }

  getActiveTheme() {
    return this.theme.asObservable();
  }

}
切换主题

src/pages/home/home.ts

import {
  Component
} from '@angular/core';
import {
  NavController
} from 'ionic-angular';
import {
  SettingsProvider
} from '../../providers/settings/settings';


@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {
  selectedTheme: string;
  constructor(public navCtrl: NavController, private settings: SettingsProvider) {
    this.settings.getActiveTheme().subscribe(val => this.selectedTheme = val);
  }

  toggleAppTheme() {
    if (this.selectedTheme === 'dark-theme') {
      this.settings.setActiveTheme('light-theme');
    } else {
      this.settings.setActiveTheme('dark-theme');
    }
  }
}

src/pages/home/home.html

<ion-header>
  <ion-navbar>
    <ion-title>Night & Day</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
  <p text-center>I shine at night and glow at day.</p>
  <button ion-button full icon-left (click)="toggleAppTheme()">
    <ion-icon name="bulb"></ion-icon>Toggle Theme
  </button>
</ion-content>
将选定的主题应用到根组件上

src/app/app.component.ts

import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';

import { HomePage } from '../pages/home/home';
import { SettingsProvider } from '../providers/settings/settings';
@Component({
  templateUrl: 'app.html'
})
export class MyApp {
  rootPage:any = HomePage;
  selectedTheme: string;
  constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, settings: SettingsProvider) {
    settings.getActiveTheme().subscribe(val => this.selectedTheme = val);
    platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      statusBar.styleDefault();
      splashScreen.hide();
    });
  }
}

src/app/app.html

<ion-nav [root]="rootPage" [class]="selectedTheme"></ion-nav>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,079评论 25 709
  • This project was bootstrapped with Create React App. Belo...
    unspecx阅读 10,587评论 0 2
  • 诊所中。 “疼疼疼,疼死了!”赵小语捂着腮帮子泪眼迷蒙的对着王浴阳喊疼。 可这厮丝毫不为所动,并且嘴里轻轻的飘出俩...
    七加阅读 3,607评论 2 2
  • 文/清清 我们总是喜欢说“再见”,希望能够“再次相见”。却不知一场“离别”才发现,说了“再见”,原来是“再也不见”...
    青清风阅读 4,288评论 0 7
  • 一个男孩十八岁,什么样的一个概念?在其他人身上,是成年了或是其他。但是,在一个,可以说是看着长大的男生身上,发生...
    沂濛阅读 2,784评论 0 3