尽管使用Clip.antialias,Container的边框仍然被裁剪。如何修复?

移动开发 2026-07-12

我的小部件包含一个被 Container 包裹的 TextField,用于样式和边框。 我必须在 TextFieldInputDecoration 中使用 filled: true。 否则,主题(flex_color_scheme)似乎不符合我的UI需求。 在这个最小示例中使用 filled: false 可以解决,但在真实应用中似乎并非如此,这也是我不能接受此类回答的另一个原因。 你可能会建议的另一种方法是padding,看起来确实能解决,但因为我不能确定在生产模式的各种设备上不会出问题,所以也不能接受这种回答。 除此之外,我没找到其他办法,在这里请求你的帮助。谢谢。

最小代码:

import 'package:animated_custom_dropdown/custom_dropdown.dart';
import 'package:flex_color_scheme/flex_color_scheme.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

// A global (or top-level) notifier for the theme state
final ValueNotifier<bool> useFlexThemeNotifier = ValueNotifier<bool>(false);

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return ListenableBuilder(
      listenable: useFlexThemeNotifier,
      builder: (context, child) {
        return MaterialApp(
          theme: useFlexThemeNotifier.value
              ? flexThemeLight
              : defaultThemeLight,
          darkTheme: useFlexThemeNotifier.value
              ? flexThemeDark
              : defaultThemeDark,
          home: MyHomePage(),
        );
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> myList = [
    "Developer",
    "Designer",
    "Consultant",
    "Student",
  ];

  @override
  Widget build(BuildContext context) {
    final colorScheme = Theme.of(context).colorScheme;

    return Scaffold(
      appBar: AppBar(
        title: const Text("custom dropdown and flex color"),
        // backgroundColor: Colors.blue.shade700,
      ),
      body: Padding(
        padding: const EdgeInsets.all(25.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            children: [
              ElevatedButton(
                onPressed: () {
                  useFlexThemeNotifier.value = !useFlexThemeNotifier.value;
                },
                child: useFlexThemeNotifier.value
                    ? const Text("Use Default color scheme")
                    : const Text("Use Flex color scheme"),
              ),
              const SizedBox(height: 10.0),
              CustomDropdown<String>(
                decoration: CustomDropdownDecoration(
                  // closedFillColor: Colors.transparent,
                  closedBorderRadius: BorderRadius.circular(30),
                  headerStyle: TextStyle(color: colorScheme.primary),
                  listItemStyle: TextStyle(color: colorScheme.primary),
                ),
                hintText: 'Select job role',
                items: myList,
                initialItem: myList[0],
                onChanged: (value) {
                  print("### changed value to: $value");
                },
              ),
              const SizedBox(height: 10.0),
              Container(
                decoration: BoxDecoration(
                  border: Border.all(
                    color: colorScheme.primary.withValues(alpha: 0.4),
                    style: BorderStyle.solid,
                  ),
                  borderRadius: BorderRadius.circular(30),
                ),
                clipBehavior: Clip.antiAlias,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  mainAxisSize: MainAxisSize.min,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    TextField(
                      textInputAction: TextInputAction.done,
                      decoration: InputDecoration(
                        filled: true,
                        fillColor: colorScheme.onPrimary,
                        // prefixIcon: const Icon(Icons.search),
                        contentPadding: EdgeInsets.symmetric(
                          horizontal: 16,
                          vertical: 8,
                        ),
                        hintText: '0.00',
                        border: InputBorder.none,
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

abstract final class AppTheme {
  // The FlexColorScheme defined light mode ThemeData.
  static ThemeData light = FlexThemeData.light(
    // Using FlexColorScheme built-in FlexScheme enum based colors
    // greenM3 a.k.a. Camarone Green in FlexColorScheme v8.
    scheme: FlexScheme.greenM3,
    appBarStyle: FlexAppBarStyle.primary,
    fontFamily: "Roboto",
    // Scaffold background customization - START:
    // scaffoldBackground: Colors.grey,
    // surfaceMode: FlexSurfaceMode.levelSurfacesLowScaffold,
    surfaceMode: FlexSurfaceMode.highScaffoldLowSurface,
    // A blendLevel of 2-5 gives a professional, slightly tinted off-white
    blendLevel: 3,
    // Scaffold background customization - END.
    // Component theme configurations for light mode.
    subThemesData: const FlexSubThemesData(
      interactionEffects: true,
      tintedDisabledControls: true,
      useM2StyleDividerInM3: true,
      inputDecoratorIsFilled: true,
      inputDecoratorBorderType: FlexInputBorderType.outline,
      alignedDropdown: true,
      navigationRailUseIndicator: true,
    ),
    // Direct ThemeData properties.
    visualDensity: FlexColorScheme.comfortablePlatformDensity,
    cupertinoOverrideTheme: const CupertinoThemeData(applyThemeToAll: true),
  );

  // The FlexColorScheme defined dark mode ThemeData.
  static ThemeData dark = FlexThemeData.dark(
    // Using FlexColorScheme built-in FlexScheme enum based colors.
    scheme: FlexScheme.greenM3,
    appBarStyle:
        FlexAppBarStyle.surface, // .primary in dark mode doesn't look good.
    fontFamily: "Roboto",
    // Scaffold background customization - START:
    // scaffoldBackground: Colors.grey,
    // surfaceMode: FlexSurfaceMode.levelSurfacesLowScaffold,
    surfaceMode: FlexSurfaceMode.highScaffoldLowSurface,
    // A blendLevel of 2-5 gives a professional, slightly tinted off-white
    blendLevel: 3,
    // Scaffold background customization - END.
    // Component theme configurations for dark mode.
    subThemesData: const FlexSubThemesData(
      interactionEffects: true,
      tintedDisabledControls: true,
      blendOnColors: true,
      useM2StyleDividerInM3: true,
      inputDecoratorIsFilled: true,
      inputDecoratorBorderType: FlexInputBorderType.outline,
      alignedDropdown: true,
      navigationRailUseIndicator: true,
    ),
    // Direct ThemeData properties.
    visualDensity: FlexColorScheme.comfortablePlatformDensity,
    cupertinoOverrideTheme: const CupertinoThemeData(applyThemeToAll: true),
  );
}

// Using the default values for Flex color scheme: Blue delight
abstract final class AppTheme02 {
  // The FlexColorScheme defined light mode ThemeData.
  static ThemeData light = FlexThemeData.light(
    // Using FlexColorScheme built-in FlexScheme enum based colors
    scheme: FlexScheme.blue,
    // Component theme configurations for light mode.
    subThemesData: const FlexSubThemesData(
      interactionEffects: true,
      tintedDisabledControls: true,
      useM2StyleDividerInM3: true,
      inputDecoratorIsFilled: true,
      inputDecoratorBorderType: FlexInputBorderType.outline,
      alignedDropdown: true,
      navigationRailUseIndicator: true,
    ),
    // Direct ThemeData properties.
    visualDensity: FlexColorScheme.comfortablePlatformDensity,
    cupertinoOverrideTheme: const CupertinoThemeData(applyThemeToAll: true),
  );

  // The FlexColorScheme defined dark mode ThemeData.
  static ThemeData dark = FlexThemeData.dark(
    // Using FlexColorScheme built-in FlexScheme enum based colors.
    scheme: FlexScheme.blue,
    // Component theme configurations for dark mode.
    subThemesData: const FlexSubThemesData(
      interactionEffects: true,
      tintedDisabledControls: true,
      blendOnColors: true,
      useM2StyleDividerInM3: true,
      inputDecoratorIsFilled: true,
      inputDecoratorBorderType: FlexInputBorderType.outline,
      alignedDropdown: true,
      navigationRailUseIndicator: true,
    ),
    // Direct ThemeData properties.
    visualDensity: FlexColorScheme.comfortablePlatformDensity,
    cupertinoOverrideTheme: const CupertinoThemeData(applyThemeToAll: true),
  );
}

final ThemeData defaultThemeLight = ThemeData.light(useMaterial3: true);
final ThemeData defaultThemeDark = ThemeData.dark(useMaterial3: true);
final ThemeData flexThemeLight = AppTheme.light;
final ThemeData flexThemeDark = AppTheme.dark;
/*
final ThemeData flexThemeLight = AppTheme02.light;
final ThemeData flexThemeDark = AppTheme02.dark;
*/

截图:

含有 clipBehavior: Clip.antiAlias

enter image description here

不含 clipBehavior: Clip.antiAlias

enter image description here

解决方案

你可以在TextDecoration里面使用 enabledBorder

TextField(
  textInputAction: TextInputAction.done,
  decoration: InputDecoration(
    filled: true,
    // .. use the same as your decoration
    enabledBorder: OutlineInputBorder(
        borderRadius: BorderRadius.circular(30)),
    focusedBorder: ,
    errorBorder: ,
    focusedErrorBorder: ,
    disabledBorder: ,
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章