【问题标题】:How to change theme using multi provider?如何使用多提供商更改主题?
【发布时间】:2020-03-04 20:19:18
【问题描述】:

我在应用程序中使用 Multiprovider,其中一个提供程序是 GlobalProvider,它包含有关应用程序范围状态的信息,我想使用该提供程序来切换主题的亮度。但是当我尝试运行附加的代码时出现错误。

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

class NextActionApp extends StatelessWidget {
  const NextActionApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<GlobalBloc>.value(
          value: GlobalBloc(),
        ),
      ],
      child: MaterialApp(
        title: 'App',
        home: InboxPage(),
        theme: ThemeData(
          primarySwatch: Colors.deepPurple,
          brightness: Provider.of<GlobalBloc>(context).isDarkModeEnabled
              ? Brightness.dark
              : Brightness.light,
        ),
      ),
    );
  }
}

【问题讨论】:

  • 您能否提供有关该错误的更多详细信息?

标签: flutter flutter-provider


【解决方案1】:

我遇到了同样的问题,用MultiProviderbuilder方法解决了。 部分

builder: (context, child) {
   return  MaterialApp ...
}

成功了。

这里有一个完整的例子:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          ChangeNotifierProvider<ThemeNotifier>(create: (context) => ThemeNotifier()),
        ],
        builder: (context, child) {
          return MaterialApp(
            title: 'Flutter Demo',
            theme: ThemeData(
              //  light theme settings
              primarySwatch: Colors.blue,
              visualDensity: VisualDensity.adaptivePlatformDensity,
            ),
            darkTheme: ThemeData.dark(
                // dark theme settings
                ),
            themeMode: Provider.of<ThemeNotifier>(context).themeMode,
            home: MyHomePage(title: 'Flutter Demo Home Page'),
          );
        });
  }
}   

【讨论】:

    【解决方案2】:

    我用下一个方法解决了这个问题:

    void main() async {
    
    
    final prefs = new PreferenciasUsuario();
      await prefs.initPrefs();
      setupLocator();
      runApp(
        MultiProvider(providers: [
          ChangeNotifierProvider<ThemeProvider>(
          create: (_) => ThemeProvider(isLightTheme: true),
        ),
    
    
        ],
        child: MyApp(),
      ));
    }
    
    class MyApp extends StatelessWidget {
      final prefs = new PreferenciasUsuario();
      @override
      Widget build(BuildContext context) {
        final themeProvider = Provider.of<ThemeProvider>(context);
        return ChangeNotifierProvider<ThemeProvider>(
          create: ( BuildContext context ) => ThemeProvider(isLightTheme: true),
          child: CustomeProvider(
            child: Consumer<ThemeProvider>(builder: ( context, model, __ ){
              return new MaterialApp(
                debugShowCheckedModeBanner: false,
                title: 'Material App',
                initialRoute: prefs.isLogged?'home':'login',
                routes: {
                  'login'   : ( BuildContext context ) => LoginPage(),
                  'home'    : ( BuildContext context ) => HomePage(),
                  'config'  : ( BuildContext context ) => ConfiguracionesPage(),
                },
                theme: model.getThemeData
              );
            })
          )
    
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2012-02-22
      相关资源
      最近更新 更多