Drawer 内の Switch で Dark/Light テーマを使用したい。私の「drawerDosyasi.dart」に「Switch」があります。しかし、最初に、HomePage(Anasayfa) で SwitchListTile を使用してコードを書きたかったのです。
2 つの質問:
1-私は今このエラーがあります
エラー: このコンシューマー ウィジェットの上に正しいプロバイダーが見つかりませんでした
これBuildContext
は、選択したプロバイダーを含まない を使用したために発生する可能性があります。一般的なシナリオがいくつかあります。
読み取ろうとしているプロバイダーは別のルートにあります。
プロバイダーは「スコープ」です。そのため、ルート内にプロバイダーを挿入すると、他のルートはそのプロバイダーにアクセスできなくなります。
BuildContext
読み取ろうとしているプロバイダーの祖先である を使用しました。Consumer が MultiProvider/Provider の下にあることを確認します。これは通常、プロバイダーを作成してすぐに読み取ろうとしたときに発生します。
たとえば、次の代わりに:
Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // Will throw a ProviderNotFoundError, because `context` is associated // to the widget that is the parent of `Provider<Example>` child: Text(context.watch<Example>()), ), }
builder
次のように使用することを検討してください:Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // we use `builder` to obtain a new `BuildContext` that has access to the provider builder: (context) { // No longer throws return Text(context.watch<Example>()), } ), }
2-スイッチをドロワーに移動できません。null にするなどのエラーが発生します。だから私はDrawerHeaderのSwitch()でダーク/ライトモードを変更できるようにしたい
誰でも私のコードを修正できますか? 私は初心者で、2日間問題を解決できません。
アナサイファ・ダート
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => ThemeNotifier(),
child: Consumer<ThemeNotifier>(
builder: (context, ThemeNotifier notifier, child) {
return MaterialApp(
title: 'Flutter Theme Provider',
theme: notifier.darkTheme ? dark : light,
home: Anasayfa(),
);
},
),
);
}
}
class Anasayfa extends StatefulWidget {
@override
_AnasayfaState createState() => _AnasayfaState();
}
class _AnasayfaState extends State<Anasayfa> {
int currentPage = 0;
nested() {
return NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
SliverAppBar(
toolbarHeight: 40,
expandedHeight: 92.0,
floating: false,
pinned: true,
flexibleSpace: FlexibleSpaceBar(
background: Image.asset(
"assets/images/besmele.jpg",
fit: BoxFit.cover,
),
),
actions: [
IconButton(
icon: Icon(Icons.account_circle),
color: Colors.white,
onPressed: () {},
),
],
)
];
},
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Consumer<ThemeNotifier>(
builder: (context, notifier, child) => SwitchListTile(
title: Text("Dark Mode"),
onChanged: (val) {
notifier.toggleTheme();
},
value: notifier.darkTheme,
),
),
],
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: nested(),
drawer: Drawer(
child: DrawerDosyasi(),
),
bottomNavigationBar: CurvedNavigationBar(
color: Colors.blue,
backgroundColor: Colors.white,
buttonBackgroundColor: Colors.blue,
height: 50,
items: <Widget>[
Icon(
Icons.campaign,
size: 20,
color: Colors.white,
),
Icon(
Icons.supervisor_account,
size: 20,
color: Colors.white,
),
Icon(
Icons.home,
size: 20,
color: Colors.white,
),
Icon(
Icons.video_collection_rounded,
size: 20,
color: Colors.white,
),
Icon(
Icons.menu_book_rounded,
size: 20,
color: Colors.white,
),
],
animationDuration: Duration(
milliseconds: 300,
),
index: 2,
animationCurve: Curves.bounceInOut,
onTap: (index) {
debugPrint("Current index is $index");
},
),
);
}
}
drawerDosyasi.dart
class DrawerDosyasi extends StatefulWidget {
@override
_DrawerDosyasiState createState() => _DrawerDosyasiState();
}
class _DrawerDosyasiState extends State<DrawerDosyasi> {
@override
Widget build(BuildContext context) {
return Container(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
DrawerHeader(
decoration: BoxDecoration(
color: Colors.blue,
),
child: Row(
children: [
Expanded(
flex: 1,
child: Switch(),
),
Expanded(
flex: 3,
child: CircleAvatar(
radius: 60,
backgroundColor: Colors.white,
),
),
Expanded(flex: 1, child: SizedBox.expand()),
],
),
),
ListTile(
leading: Icon(Icons.home),
title: Text('Anasayfa'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.account_circle),
title: Text('Profil'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.campaign),
title: Text('Duyurular'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.account_box),
title: Text('Hocalar'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.library_books),
title: Text('Dergiler'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.video_collection_rounded),
title: Text('Canlı Dersler'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.menu_book_rounded),
title: Text('Kütüphane'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.supervisor_account),
title: Text('Tartışmalar'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.create),
title: Text('Yazı Gönder'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.message_rounded),
title: Text('İletişim'),
tileColor: Colors.white,
),
ListTile(
leading: Icon(Icons.exit_to_app_rounded),
title: Text('Çıkış'),
tileColor: Colors.white,
),
],
),
);
}
}
theme.dart
ThemeData light = ThemeData(
brightness: Brightness.light,
primarySwatch: Colors.blue,
accentColor: Colors.blue,
scaffoldBackgroundColor: Color(0xfff1f1f1));
ThemeData dark = ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.indigo,
accentColor: Colors.green[700],
);
class ThemeNotifier extends ChangeNotifier {
final String key = "theme";
SharedPreferences _prefs;
bool _darkTheme;
bool get darkTheme => _darkTheme;
ThemeNotifier() {
_darkTheme = true;
_loadFromPrefs();
}
toggleTheme() {
_darkTheme = !_darkTheme;
_saveToPrefs();
notifyListeners();
}
_initPrefs() async {
if (_prefs == null) _prefs = await SharedPreferences.getInstance();
}
_loadFromPrefs() async {
await _initPrefs();
_darkTheme = _prefs.getBool(key) ?? true;
notifyListeners();
}
_saveToPrefs() async {
await _initPrefs();
_prefs.setBool(key, _darkTheme);
}
}