내 Flutter 앱에서 테마 전환

' 진행중인 작업 '시리즈의 일부

이 기사에서는 MVC 프레임 워크 라이브러리 패키지를 통해 사용자가 마우스 클릭만으로 Flutter 앱의 색상 테마를 '전환'할 수있는 방법을 살펴 보겠습니다. 관련 코드를 검토하여 MVC 프레임 워크가 자신의 Flutter 앱에서 이러한 기능을 허용하도록 설정되는 방법에 대한 추가 정보를 제공합니다.

진행중인 작업

이것은 WorkingMemory 라는 간단한 'ToDo'앱의 진행 상황을 다루는 ' A Work in Progress ' 시리즈 기사의 일부입니다 . 이 시리즈의 의도는이 앱의 모든 측면의 구현, 구성 및 MVC 프레임 워크 라이브러리 패키지 mvc_application 의 사용을 문서화하는 것 입니다.

나는 스크린 샷을 좋아한다. 요점을 클릭하십시오.

항상 그렇듯이, 저는 기사에 코드를 표시하는 것보다 개념을 보여주기 위해 요점보다 스크린 샷을 사용하는 것을 선호합니다. 작업하기 쉽고 읽기 쉽습니다. 그러나 코드를 클릭하거나 탭하여 요점 또는 Github에서 코드를 볼 수 있습니다. 아이러니하게도 휴대폰보다 컴퓨터에서 모바일 개발에 대한이 기사를 읽는 것이 좋습니다. 게다가 우리는 주로 휴대폰이 아닌 컴퓨터로 프로그래밍합니다. 지금은.

동영상 없음, 소셜 미디어 없음

이 기사에는 현재 주제의 측면을 보여주는 gif 파일 이 있습니다 . 그러나 인스 타 그램, 페이스 북 등과 같은 플랫폼에서이 기사를 읽을 때는 이러한 gif 파일을 볼 수 없다고합니다. 정적 인 그림이나 단순히 빈 자리 표시 자 상자로 나올 수 있습니다. 이 점에 유의하고 medium.com에서이 기사를 읽으십시오.

의 시작하자.

Greg Perry의 기타 이야기

사실,이 기사는 Ritesh Sharma의 기사 인 여우처럼 Flutter 앱에서 테마 전환 에서 영감을 받았습니다 ! 그의 접근 방식은 Norbert Kozsir의 자체 라이브러리 패키지 인 dynamic_theme 를 사용하여 사용자가 메뉴 드롭 다운에서 하나를 선택할 때 앱 테마를 동적으로 전환하는 데 도움을줍니다.

Flutter 앱에서 여우처럼 테마를 전환하세요!

랩핑 테마

DynamicTheme 라이브러리 패키지를 사용한다고 언급했습니다. 앱의 '루트 위젯'이어야합니다 (즉, 앱에 대해 인스턴스화 된 첫 번째 State 개체). 라이브러리 패키지를 '루트 위젯'으로 구현하는 것은 이전에 여러 번 본 사례였습니다. 이렇게하면 라이브러리 패키지의 setState () 함수 호출이 MaterialApp 위젯 또는 그 주위를 둘러싼 CupertinoApp 위젯을 다시 빌드합니다.

예를 들어, 아래는 MaterialApp 위젯이 실제로 DynamicTheme 위젯에 포함되어 있음을 쉽게 확인할 수있는 Ritesh Sharma의 샘플 코드 스크린 샷입니다. 개인적으로 저는이 접근 방식이 마음에 들지 않습니다. 동일한 기능을 달성해야하는 다른 위젯이 있다면 어떨까요? 그런 다음 다른 위젯을 끝없이 감싸고 있습니까? 필요한 모든 것이 특정 State 개체에 대한 액세스 준비가되었을 때 솔직히보기 흉할 것입니다.

빌드 () 함수에 앱의 MaterialApp 또는 CupertinoApp 위젯이 포함 된 State 개체에 액세스하기 만하면됩니다. 해당 State 객체에 액세스 할 수 있으면 setState () 함수에 액세스 할 수 있습니다 . 무슨 말인지 알 겠어요? 어쨌든 다른 접근 방식이 있습니다. 제 생각에는 더 간단하고 깔끔한 접근 방식입니다. 이 접근 방식에는 특정 State 개체에 대한 액세스를 제공하는 기성 프레임 워크가 포함됩니다. 이것이이 기사의 모든 내용입니다.

main.dart

테마 설정

이 대안을 살펴보기 전에이 '동적 테마'를 달성하는 데 관련된 기본 사항을 이해하기 위해이 접근 방식을 계속해 보겠습니다. 따라서 앱의 테마를 변경할 때 모두 MaterialApp 위젯 또는 CupertinoApp 위젯을 다시 호출하지만 이름이 지정된 매개 변수 인 theme에 대해 다른 값을 사용합니다 . 즉 , MaterialApp 위젯 또는 CupertinoApp 위젯을 포함하는 State 개체의 build () 함수 를 호출하는 것이 전부 이며, 물론 해당 State 개체의 setState () 함수 를 호출하여 달성됩니다 . 지금까지 팔로우 하시겠습니까?

아래의 왼쪽 스크린 샷에서이 프로세스를 볼 수 있습니다. 예를 들어 새 테마가 선택되면 'themedWidgetBuilder'함수가 다시 호출되고 앱의 MaterialApp 위젯을 반환하지만 해당 변수 인 theme , ThemeData 를 전달하기 전에는 반환하지 않습니다 . 이는 'themedWidgetBuilder'함수가 일부 State 개체의 build () 함수 어딘가 에서 반복해서 호출 된다는 것을 의미하며, 실제로 오른쪽의 스크린 샷 아래를 살펴볼 때의 경우입니다.

'theme'는 _data 라는 개인 인스턴스 변수에서 전달됩니다 . 빌드 아시다시피 () 함수는 상태 개체의 모든 호출로, 또 다시 호출 setState를 () 함수. 그래서 간단히 말해서 앱 테마의 '동적 변화'가 달성되는 방법입니다. 그러나 더 자세히 설명하고 setState () 함수가 언제 어디서 호출 되는지 보여줄 것 입니다.

main.dart 및 dynamic_theme.dart

테마 변경

Ritesh Sharma의 샘플 코드에서 사용자가 메뉴 드롭 다운에서 다른 테마 옵션을 선택하면 changeColor () 함수 가 호출됩니다. DynamicTheme.of () 함수 가 State 개체 인 DynamicThemeState 를 가져 오는 곳 입니다. 그런 다음 해당 State 개체의 setThemeData () 함수가 호출되어 선택한 'ThemeData'값을 전달합니다. 이것은 아래의 첫 번째 빨간색 화살표로 모두 강조 표시됩니다.

home_page.dart

해당 State 객체 DynamicThemeState 는 Norbert Kozsir의 라이브러리 패키지 dynamic_theme 에서 찾을 수 있으며 setThemeData () 함수 가 선택한 ThemeData를 _data 라는 개인 인스턴스 변수에 할당하는 입니다. 그 변수를 기억하십니까? State 객체의 setState () 함수 에 포함 된 상태에서이 작업을 수행하며 거기에 있습니다. 그러면 State 개체의 build () 함수가 다시 호출됩니다. 따라서 MaterialApp 위젯이 다시 호출되고 선택된 ThemeData 객체를 명명 된 매개 변수 인 theme에 전달합니다 . 따라서 앱의 '색상 테마'가 동적으로 변경됩니다. 쉬워요.

dynamic_theme.dart

다시 말하지만, 여기서 중요한 것은 전체 앱의 측면을 변경하려는 경우 'root'State 개체에 대해 setState () 함수 를 호출하는 것 입니다.

나만의 테마

내 'ToDo'앱인 WorkingMemory 는 동일한 기능을 가지고 있습니다. 목록에서 선택하여 '테마'를 변경할 수도 있습니다. 또한 실행중인 플랫폼에 따라 MaterialApp 위젯 또는 CupertnoApp 위젯을 포함하는 State 개체의 build () 함수를 반복해서 호출하는 동일한 기본 메커니즘을 사용합니다 . 물론이 앱은 라이브러리 패키지 mvc_application 에서 제공하는 MVC 프레임 워크를 사용 하므로 이러한 작업을 수행하는 수단을 제공하는 것이 바로 프레임 워크입니다.

그러나 DynamicTheme.of ()가 위젯 트리에서 특정 State 객체를 검색 하는 DynamicTheme 패키지와 달리 프레임 워크는 항상 관심있는 특정 State 객체 (Flutter 앱 빌드의 '루트 위젯'을 구성하는 객체)에 액세스 할 준비가되어 있습니다. 틀에. 아래 스크린 샷은 중단 점이 배치 된 위치를 보여줍니다. MaterialApp 위젯에 대해 명명 된 매개 변수 인 theme 에 적절한 ThemeData 값이 할당 된 프레임 워크의 실행이 중지됩니다 . 이 경우 여기에 표시된 코드는 AppView 라는 State 개체에서 찾을 수 있습니다.

app.dart

프레임 워크이므로 Ritesh Sharma의 샘플 코드와 달리 위의 스크린 샷은 MaterialApp 위젯에 할당 된 가능한 모든 매개 변수로 인해 훨씬 ​​더 바쁘게 보입니다. 이는 이러한 유틸리티 클래스의 공통적 인 특성 인 많은 매개 변수 유효성 검사입니다. 물론 모든 매개 변수 값을 제공 할 의무는 없습니다. 예를 들어 아래의 내 'ToDo'앱 스크린 샷에는 전달 된 매개 변수 값이 두 개뿐입니다. 나머지는 다른 Flutter 앱과 마찬가지로 기본값으로 검증됩니다. 그러나 나는 빗나 갔다.

view.dart

테마 메뉴

Sharma의 예와 마찬가지로 WorkingMemory 앱에는 드롭 다운 메뉴에서 사용할 수있는 색상 테마 배열이 있습니다. 왼쪽 아래 스크린 샷은 AppViewState 클래스 의 initState () 함수를 보여 줍니다 . AppView 는이 프레임 워크에서 AppViewState 클래스를 확장 하므로 Flutter 앱에 대해 모두 동일한 '루트 위젯'입니다. 아래에서 State 객체의 initState () 함수 에서 초기화되는 앱의 메뉴를 볼 수 있습니다 . 초기화의 일부는 앱을 마지막으로 선택한 색상 테마로 반환하는 것이며, Sharma의 자체 샘플 코드와 마찬가지로 SharedPreferences는 마지막으로 선택한 색상 테마를 결정하는 데 사용됩니다.

오른쪽 아래에 표시된 gif는 메뉴 드롭 다운에서 색상 선택기 열기 및 새 색상 테마 선택을 보여줍니다.

app.dart

물론 다음 Flutter 앱에서이 '앱 메뉴'를 사용할 의무가 없습니다. 그러나 다른 좋은 프레임 워크와 마찬가지로 옵션으로 제공됩니다. Bizaar라는 다른 샘플 앱에서이 프레임 워크를 사용했으며 해당 앱에는 메뉴 드롭 다운이 전혀 없습니다. 그러나 다른 측면에서 앱의 '테마'도 변경합니다. 원하는 경우 아래의 TL; DR 섹션에서 이에 대한 자세한 내용을 읽을 수 있습니다.

당신의 테마는 무엇입니까

그러나이 WorkingMemory 앱에서는 프레임 워크에서 제공하는 기본 메뉴 드롭 다운을 통합합니다. 이렇게하면 앱의 색상 테마를 변경하는이 귀여운 '색상 선택기'뿐 아니라 표준 '정보'옵션을 사용할 수 있습니다. Appmenu 클래스의 init () 함수 스크린 샷은 마지막으로 선택한 색상 테마가 앱에 어떻게 다시 할당되는지 보여줍니다. 다음에 onChange () 함수 내부를 살펴 보겠습니다 .

appmenu.dart

당신의 선호는 무엇입니까

기본 설정을 유지하는 것은 모바일 앱에서 흔히 볼 수있는 기능이며 '공유 기본 설정'기능은 프레임 워크에 포함되어 있습니다. 함수 onChange () 및 getter 인 colorSwatch , 라이브러리 패키지 Prefs 가 사용됩니다. Ritesh Sharma의 샘플 코드와 마찬가지로 Prefs는 플러그인 shared_preferences 와 함께 작동 하여 마지막으로 선택한 색상 테마를 보존 한 다음 검색합니다. 제 경우 에는 플러그인 작업을 좀 더 쉽게하기 위해 라이브러리 패키지 Prefs 를 작성했습니다.

appmenu.dart

테마 변경

색상 선택기가 열리고 새 색상이 선택되면 onChange () 함수 가 호출됩니다. 모든 마법은이 기능에서 발생합니다. 함수 아래의 스크린 샷은 선택한 ColorSwatch 값이 앱의 themeData 속성에 할당 된 다음 State 개체의 새로 고침 () 함수가 호출 되었음을 보여줍니다 . 물론, 기본 코드에서 더 많은 일이 진행되고 있지만,이 쪽에서 거의 모든 것이 있습니다. 앱이 iOS에서 실행중인 경우 선택한 색상을 수신하는 'Cupertino'대응 항목도 있습니다. 아래 중단 점은 Prefs.setInt () 함수를 강조 표시합니다 . 다음에 앱이 시작될 때 공유 기본 설정에서 선택한 값을 기록합니다.

appmenu.dart

위의 스크린 샷에서 새로 고침 () 함수를 호출하면 결국 빌드 () 함수를 다시 실행하는 AppView State 개체가 생성 됩니다. 아시다시피 MaterialApp 위젯이 다시 빌드되고 중단 점이 코드 실행을 중지 한 아래에서 볼 수 있듯이 명명 된 매개 변수 인 theme에 App 속성 App.themeData 가 다시 할당됩니다 . 위의 스크린 샷에서 값이 변경되었습니다.

app.dart

옵션은 테마입니다

다시 말하지만, 프레임 워크이기 때문에 해당 중단 점에서 명명 된 매개 변수 인 theme에 대한 두 가지 다른 소스가 있음을 알 수 있습니다. 왜? 때문에! 그게 이유입니다. 프레임 워크는 특정 Flutter 앱에서 다른 앱으로 앱의 테마가 생성되는 방식을 지시 할 수있는 다른 상황을 허용해야합니다.

예를 들어 'ToDo'앱의 'View'클래스에 '테마'를 쉽게 할당 할 수 있습니다. 한 번만 두 개의 매개 변수 값이 있었던 내 'ToDo'앱의 아래 스크린 샷에는 이제 세 번째 매개 변수 값이 있습니다. 이제 정교한 테마가 이름 지정된 매개 변수 인 theme에 명시 적으로 할당됩니다 .

view.dart

이 프레임 워크에서 theme 속성이 App 속성 인 App.themeData 보다 우선합니다 . 물론 좋은 프레임 워크와 마찬가지로 또 다른 옵션이 있습니다. 천국은 일부 앱에서 테마가 어떻게 인정되는지 알고 있습니다. 앱이 앱의 테마를 가져 오기 위해 파일이나 데이터베이스를 읽을 수 있습니다. 인터넷이 관련되어있을 수 있습니다. 그럼에도 불구하고 onTheme () 함수 가 들어오는 곳입니다.

아래 스크린 샷에서는 이름이 지정된 매개 변수 인 theme 에 명시 적으로 전달하는 대신 onTheme () 함수를 사용하여 대신 '보라색-황색'색상 테마를 도입 했습니다 . 이것은 이와 관련하여 옵션이 있음을 보여주기위한 것입니다. 그 기능에는 무엇이든 가질 수 있습니다. 내가 뭘 알 겠어?! 당신의 앱입니다! 물론 위의 AppView 코드를 보았으므로 이제는 MaterialApp 위젯 또는 CupertinoApp 위젯에 전달되는 모든 단일 매개 변수에도 이러한 옵션이 있다는 것을 알 수 있습니다. 좋은.

view.dart

따라서 아래에서 AppView State 개체에 대한 build () 함수를 다시 살펴보면 'if null'연산자 ?? , App.themeData 속성을 떠나 기본 테마 값을 제공하는 이 우선 순위를 적용 합니다. 앱의 메뉴 드롭 다운에서 변경하는 속성입니다. 지금 사세요?

app.dart

테마 새로 고침

onChange () 함수 로 돌아가서 App.themeData 속성 에 새 값이 할당되면 App의 MaterialApp 위젯이 어떻게 다시 호출되고 다시 빌드되는지 살펴 보겠습니다. 글쎄, Ritesh Sharma의 샘플 코드와 마찬가지로 'Root Widget' 의 setState () 함수가 실제로 호출됩니다. 그러나 이것은 '래퍼'클래스를 사용하지 않고 프레임 워크에 의해 수행됩니다. 프레임 워크가 처음 시작되면 개발자가 필요로하는 경우 '루트'상태 개체에 즉시 액세스 할 수 있습니다. 이제 특정 setState () 함수가 어떻게 호출 되는지 보여 드리겠습니다 .

appmenu.dart

위의 스크린 샷을보고 새로 고침 () 함수를 확인 합니다. 이제 앱의 인터페이스를 다시 빌드하는 데 사용되는 표준 Flutter 함수가 아닙니다. 대신 해당 역할을 수행하는 setState () 함수에 익숙 할 것입니다 . 아니요,이 함수 인 refresh ()는 프레임 워크에 있으며 현재 State 개체의 setState () 함수를 호출하는 것 이상의 몇 가지 작업을 수행합니다.

아래는 특정 새로 고침 () 기능 의 스크린 샷입니다 . super.refresh () 명령을 사용하여 부모 클래스의 refresh () 함수 를 호출 한 다음 앱의 자체 새로 고침 () 함수 인 App.refresh () 를 호출합니다 . 이 기사에서 특히 흥미로운 것은 그 기능이지만 계속합시다.

app.dart

슈퍼 리프레쉬

setState () 함수가 호출 되는 것을 볼 수 있는 super.refresh () 함수에 있습니다 . 새로 고침 라이브러리 패키지 () 함수가 상주 mvc_pattern 핵심 구성 요소입니다, 그 떨림의 MVC 디자인 패턴의 구현. 그러나 아래 스크린 샷을 자세히 살펴보면 이 MVC 라이브러리 패키지에 있는 setState () 함수도 있음을 알 수 있습니다. refresh () 함수 위에 나열되어 있으며, 마지막으로 Flutter의 자체 setState () 함수를 호출 하여 인터페이스를 다시 빌드하는 함수입니다. 물론 인스턴스 변수 _rebuildAllowed로 허용되는 경우입니다. 하지만 다른 시간에 대해서는 완전히 다른 이야기입니다.

mvc_pattern.dart

앱의 새로 고침

이제 위의 중단 점이 코드 실행을 중지하도록 설정된 App.refresh () 함수를 빠르게 살펴 보겠습니다 . 프레임 워크가 실제로 _vw 라는 '루트'State 객체에 대한 참조를 가지고 있음을 쉽게 알 수 있습니다 . AppView 라는 State 객체를 참조하는 것은 이 인스턴스 변수 _vw 입니다.

물론 개발자로서이 모든 것을 알 필요는 없습니다. App.refresh () 를 호출 할 때를 알면 새로 고침 () 함수 를 호출합니다. 그러면 자체 setState () 함수가 호출되어 상주 MaterialApp 위젯을 다시 빌드 하는 것으로 추론 할 수 있습니다 . 당신도 그 사실을 알 필요가 없습니다. 호출 할 때 전체 앱이 '새로 고침'된다는 것을 알고 새로 고침 ()하세요.

app.dart

그것에 맡기자. WorkingMemory 앱에 별표를 표시하거나 포크하고 원하는 경우 따르십시오. 앞으로 몇 달 동안이 앱을 작업 할 것입니다. 일이 진행됨에 따라이 Flutter 앱의 특정 측면과 라이브러리 패키지 mvc_application을 통해 MVC 디자인 패턴을 사용하는 방법에 대한 보충 기사를 작성할 것입니다.이 모든 것은 유지 관리 가능하면서도 강력한 Flutter 앱을 프로덕션에 출시 할 수 있도록 만들기위한 노력의 일환입니다.

건배.

TL; DR

또 다른 Bizaar 사례

Bazaar 라는 또 다른 샘플 앱과 관련하여 빠르게 검토하고 싶은 또 다른 예가 있습니다 . 이 앱은 무료 기사 인 Bazaar in MVC 에서 자세히 설명 하지만 여기서는 테마의 '전환'과 관련된 한 가지 측면을 살펴보고 싶었습니다. 이 경우 사용자는 테마를 밝은 모드에서 어두운 모드로 변경하고 다시 되돌릴 수 있습니다.

약간 다르게 구현되었지만 동일한 MVC 프레임 워크 인 mvc_application을 기반으로 구축되어 프레임 워크를 여러 방식으로 사용할 수 있음을 보여줍니다. 개발자는 코드를 특정 요구 사항에 맞게 특정 모양과 느낌에 맞게 조정할 수 있습니다.

'다크 모드'로 전환했다가 다시 돌아 오면 말 그대로 스위치 위젯이 호출되어 작업을 수행합니다. 아래는 다크 모드로 전환했다가 다시 돌아 오는 앱 자체의 gif 파일과 함께 해당 코드의 스크린 샷입니다.

homeDrawer.dart

따라서 위에서 볼 수 있듯이 사용자가 스위치를 탭하면 함수 setDarkMode ()가 호출 된 다음 함수 refresh () 가 호출됩니다 . 새로 고침 () 함수에 이미 익숙 합니다. 아래에서 첫 번째 화살표는 다음에 앱을 시작할 때 현재 모드를 '기억'하는 데 사용되는 기본 설정 루틴을 가리 킵니다. 그런 다음 함수 setTheme ()가 호출되고 적절한 'theme'를 인스턴스 변수 themeData에 할당 합니다. 지금까지 팔로우 하시겠습니까?

themeChanger.dart

테마 새로 고침

이전에 본 예와 같이 setState () 함수가 호출되어 MaterialApp () 위젯이 '다시 빌드'됩니다. 따라서 이름 지정된 매개 변수 인 theme 에 최신 값이 지정됩니다. 아시다시피,이 프레임 워크에서는 함수 refresh ()이며 결국 setState () 함수를 호출합니다 .

app.dart

이 앱에서 onTheme () 함수 는 최신 값을 제공하는 데 사용됩니다. 아래에서 호출 될 때 해당 값을 얻기 위해 Controller, ThemeChanger로 바뀝니다 . 내 'ToDo'앱과는 조금 다른 데요? 그래도 완벽하게 받아 들일 수 있습니다. 프레임 워크는 '그것과 함께 굴러 갈'수 있어야합니다.

BazaarApp.dart

해당 함수 인 getTheme ()를 살펴보면 인스턴스 변수 T hemeData가 있습니다. 여기서 어떻게 작동하는지 보시겠습니까? 이전에 인스턴스 변수 T hemeData를 보았습니다 . 함수 setTheme () 에 새 값이 할당되었습니다 .

themeChanger.dart

상태 새로 고침

다시 말하지만, AppView 개체는이 프레임 워크의 '루트'State 개체입니다. 따라서 앱의 어느 곳에서나 새로 고침 () 함수가 호출되면 AppView는 다시 빌드 () 함수를 호출하여 MaterialApp 위젯을 다시 호출하고이 경우 앱에 최신 테마를 할당합니다.

homeDrawer.dart

테마 초기화

프레임 워크의 StateMVC 개체의 확장 인 AppView 개체는 자신의 initState () 함수와 보유 할 수있는 모든 Controller 개체 의 initState () 함수를 호출합니다 . 이것이 왼쪽 아래 스크린 샷에서 볼 수있는 것입니다. BaraarApp (AppView 확장) 클래스에는 .NET 과 함께 작동 하는 Controller, BazaarAppThemeChanger있습니다. 따라서 State 개체가 ThemeChanger의 initState () 함수를 호출 할 때 오른쪽 아래 스크린 샷에서 볼 수 있듯이이 앱이 시작될 때 표시 될 테마를 획득합니다. 쉬워요.

BazaarApp.dart 및 themeChanger.dart

먼저 자신의 상태를 설정하십시오

참고 호출 새로 고침 당신이 전화하는거야 () 함수 수단 setState를 '현재'국가 개체의 () 함수 다음 setState를 앱 조회 주 객체의 () 함수를. 아래 스크린 샷에서 두 함수를 호출하는 것과 유사합니다. 자, 왜 그렇게 하시겠습니까? 글쎄, 내가 보여 줄게.

themeChanger.dart

코드를 약간 수정하고 'App Refresh'기능을 호출하면 어떻게되는지 살펴 보겠습니다. 미묘하지만 새 모드에서 스위치가 변경되지 않는다는 것을 알 수 있습니까?! 원하는 경우 '현재 화면'이 setState () 함수 호출 로 다시 빌드되지 않았습니다 . 더 나은 단어가 부족한 경우 '루트 화면'만 있습니다.

themeChanger.dart

현재 State 객체의 setState () 함수를 호출 해 보겠습니다 . 물론 이제 스위치가 다시 생겼습니다. 탭하면 변경되지만 그게 다입니다. 앱이 색상 테마를 전혀 변경하지 않습니다. 이 특별한 경우에는 원하는 사용자 경험을 제공하기 위해 둘 다 필요한 것 같습니다.

themeChanger.dart

아래를 참조하십시오. 둘 다 돌아 왔고 모두 정상으로 돌아 왔습니다. 물론 지금 줄에서 삭제하고 함수 호출 refresh ()의 주석 처리를 제거하는 것도 작동합니다.

지금은 그게 다입니다. 이제 '루트 위젯'에 액세스 할 수있는 또 다른 방법이 있습니다. 더 중요한 것은 루트 위젯의 State 객체에 액세스하는 것입니다. 결국 루트 build () 함수를 포함하는 객체입니다.

건배.

→ Greg Perry의 다른 이야기

YouTube에서 Flutter 디코딩

Suggested posts

좋은 습관을 만들고 유지하는 방법

장기적인 습관을 유지하기위한 생산성 팁

좋은 습관을 만들고 유지하는 방법

두 아이의 엄마가 된 후 일을 끝내기가 더 어려워졌습니다. 나는 한 작업에서 다음 작업으로 뛰어 들었고 하루가 끝날 때까지 아무것도하지 않았을 때 실망했습니다.

양자 컴퓨팅 Pt를위한 프로그래밍. 1 : NumPy

이제 양자 컴퓨팅이면의 물리학을 배우기 시작 했으므로 "이봐, 실제로 양자 컴퓨터를 사용하려면 실제로 양자 장치를 손으로 만들어야합니까?"라고 궁금해 할 것입니다. 답은 양자 컴퓨터를 컴퓨터라고 부르는 이유가 있습니다. 프로그래밍이 가능합니다! 이 시리즈에서는 수학 개념을 시뮬레이션하고 양자 컴퓨터에서 실행하는 소프트웨어를 구축하는 방법을 배우게됩니다. 깨끗하고 현대적이며 라이브러리가 풍부한 언어이기 때문에 Python을 사용하여 코드를 작성할 것입니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.