android - Flutter:使用 Cupertino DatePicker 时出现的问题

标签 android ios flutter dart flutter-cupertino

我正在尝试检查用户的设备操作系统并向 iOS 用户显示库比蒂诺日期选择器,并向 Android 用户显示 Material 日期选择器。下面是我的代码

Future<void> _selectDate(BuildContext context) async {
    DateTime? picked;

    if (Platform.isIOS) {
      showCupertinoModalPopup(
        context: context,
        builder: (context) {
          return Theme(
            data: ThemeData.dark(),
            child: Container(
              height: 300,
              color: Color.fromARGB(255, 255, 255, 255),
              child: CupertinoDatePicker(
                  mode: CupertinoDatePickerMode.date,
                  initialDateTime: DateTime.now(),
                  onDateTimeChanged: (val) {
                    setState(() {
                      picked = val;
                    });
                  }),
            ), // This will change to light theme.
          );
        },
      );
    } else if (Platform.isAndroid) {
      picked = await showDatePicker(
          context: context,
          initialDate: selectedDate,
          firstDate: DateTime(2015, 8),
          lastDate: DateTime(2101),
          builder: (context, child) {
            return Theme(
                data: ThemeData.dark(), // This will change to light theme.
                child: child!);
          });
    }

    if (picked != null && picked != selectedDate)
      setState(() {
        selectedDate = picked!;
        formattedSelectedDate = picked.toString();
      });
  }

我的 Android 代码运行良好。但是我的 iOS 代码中存在以下问题。

  1. 我无法关闭弹出窗口
  2. 这将作为底部工作表打开,但我更喜欢像 Android 版本那样作为对话框。

如何解决这些问题?

最佳答案

尝试下面的代码希望对您有所帮助。

你的android datePicker方法:

androidDatePicker(BuildContext context) async {
    chosenDateTime = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(2000),
      lastDate: DateTime(2100),
    );
    print(chosenDateTime);
  }

你的iOS日期选择器方法

iosDatePicker(BuildContext context) {
    showCupertinoModalPopup(
        context: context,
        builder: (BuildContext builder) {
          return Container(
            height: MediaQuery.of(context).copyWith().size.height * 0.25,
            color: Colors.white,
            child: CupertinoDatePicker(
              mode: CupertinoDatePickerMode.date,
              onDateTimeChanged: (value) {
                chosenDateTime = value;
                print(chosenDateTime);
              },
              initialDateTime: DateTime.now(),
              minimumYear: 2000,
              maximumYear: 3000,
            ),
          );
        });
  }

您的小部件:

ElevatedButton(
    onPressed: () {
      if (defaultTargetPlatform == TargetPlatform.macOS ||
          defaultTargetPlatform == TargetPlatform.iOS) {
        iosDatePicker(context);
      } else {
        androidDatePicker(context);
      }
    },
    child: Text('Pick Date'),
  ),

完整示例:

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class HomeScreen extends StatelessWidget {
  DateTime? chosenDateTime;
  //android datepicker
  androidDatePicker(BuildContext context) async {
    chosenDateTime = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(2000),
      lastDate: DateTime(2100),
    );
    print(chosenDateTime);
  }
//ios date picker
  iosDatePicker(BuildContext context) {
    showCupertinoModalPopup(
        context: context,
        builder: (BuildContext builder) {
          return Container(
            height: MediaQuery.of(context).copyWith().size.height * 0.25,
            color: Colors.white,
            child: CupertinoDatePicker(
              mode: CupertinoDatePickerMode.date,
              onDateTimeChanged: (value) {
                chosenDateTime = value;
                print(chosenDateTime);
              },
              initialDateTime: DateTime.now(),
              minimumYear: 2000,
              maximumYear: 3000,
            ),
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            if (defaultTargetPlatform == TargetPlatform.macOS ||
                defaultTargetPlatform == TargetPlatform.iOS) {
              iosDatePicker(context);
            } else {
              androidDatePicker(context);
            }
          },
          child: const Text('Pick Date'),
        ),
      ),
    );
  }
}

引用 (Android) 日期选择器 showDatePickerflutter_datetime_picker

引用 (iOS) Cupertino Datepicker 和 Time Picker 的一些软件包 flutter_cupertino_date_pickerflutter_cupertino_datetime_picker

关于android - Flutter:使用 Cupertino DatePicker 时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71524010/

相关文章:

java - Android AES解密返回稀有字符

android - 在 Android Studio 中通过 firebase 发送通知的 Gradle 设置问题

ios - 如何衡量用户在 iOS 应用程序中完成特定操作需要多长时间

flutter - 从 TabBarView Child 导航到另一个 Route(全屏)

node.js - 无法通过nodejs和flutter使用预先签名的url在aws s3上上传图像

android - 使用 Xamarin.iOS 和 Xamarin.Droid 创建 native 自定义控件

Android MapView 缩放到半径

ios - 在 iOS 中运行 MQTT 代理

Javascript 库无法在设备上运行

amazon-web-services - AWS 转录流 BadRequestException : "Could not decode the audio stream..."