Flutter:如何在 Cupertino 主题中主题化材质小部件?

问题描述

我有一个 Flutter 应用程序,它使用 Android 的 Material 主题和 iOS 的 Cupertino 主题。但是我在两个主题中都使用了 Card 小部件,它是一个 Material 小部件。现在我在 main.dart

中有以下代码
Widget build(BuildContext context) => PlatformProvider(
      builder: (BuildContext context) => PlatformApp(
            cupertino: (_,__) => CupertinoAppData(
                theme: CupertinoThemeData(brightness: Brightness.light,...)),material: (_,__) => MaterialAppData(
                theme: ThemeData(
                  brightness: Brightness.light,primarySwatch: Colors.deepPurple,cardTheme: CardTheme(
                    color: Colors.grey,...
                  )
                  ...
                ),),......

如您所见,Card 小部件在材质 cardTheme 中使用 ThemeData 进行主题化,但 cardTheme 中没有对应的 CupertinoThemeData。因此,在 iOS 上,Card 仅使用其主题

那么我如何在 Cupertino 主题中设置像 Card 这样的 Material 小部件的主题

解决方法

我尝试使用 MaterialBasedCupertinoThemeData https://api.flutter.dev/flutter/material/MaterialBasedCupertinoThemeData-class.html 时遇到了同样的问题,但它没有正确尊重黑暗主题。最终,我找到了一个解决方案,即如何同时将 MaterialTheme 与 CupertinoTheme 结合起来并正确应用暗/亮主题:

@override
Widget build(BuildContext context) {
  final Brightness platformBrightness = WidgetsBinding.instance!.window.platformBrightness;
  return Theme(
    data: ThemeData(brightness: platformBrightness),child: CupertinoApp(
      theme: CupertinoThemeData(
        brightness: platformBrightness,),);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...