You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取系统日历设置的每周第一天索引?

兼容iOS和Android的系统日历每周第一天获取方案

你用MaterialLocalizations.of(context).firstDayOfWeekIndex得到的是Locale默认的每周第一天,并非用户在手机系统日历里手动修改的自定义设置,所以会出现和实际日历显示不一致的情况。要获取系统日历的真实设置,需要通过原生平台API获取,再用MethodChannel桥接到Flutter。

1. Flutter端实现

创建MethodChannel,定义调用原生方法的逻辑:

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class SystemCalendarSettings {
  static const MethodChannel _channel = MethodChannel('system_calendar_settings');

  // 获取系统日历的每周第一天索引(0=周日,1=周一,以此类推)
  static Future<int> getFirstDayOfWeekIndex() async {
    try {
      final int result = await _channel.invokeMethod('getFirstDayOfWeek');
      return result;
    } on PlatformException catch (_) {
      // 原生调用失败时, fallback到Locale默认值
      return MaterialLocalizations.of(WidgetsBinding.instance.context).firstDayOfWeekIndex;
    }
  }
}

使用示例:

int firstDayIndex = await SystemCalendarSettings.getFirstDayOfWeekIndex();

2. Android端实现

在MainActivity.kt(或Java)中添加MethodChannel处理逻辑:

Kotlin版本

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.util.Calendar

class MainActivity : FlutterActivity() {
    private val CHANNEL = "system_calendar_settings"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getFirstDayOfWeek") {
                val firstDay = Calendar.getInstance().firstDayOfWeek
                // Android中Calendar.SUNDAY=1,Calendar.MONDAY=2,转成0-based索引
                result.success(firstDay - 1)
            } else {
                result.notImplemented()
            }
        }
    }
}

Java版本

import android.os.Bundle;
import java.util.Calendar;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "system_calendar_settings";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(
                (call, result) -> {
                    if (call.method.equals("getFirstDayOfWeek")) {
                        int firstDay = Calendar.getInstance().getFirstDayOfWeek();
                        // 转成0-based索引
                        result.success(firstDay - 1);
                    } else {
                        result.notImplemented();
                    }
                }
        );
    }
}

3. iOS端实现

在AppDelegate.swift中添加MethodChannel处理逻辑:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    private let CHANNEL = "system_calendar_settings"

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
            guard call.method == "getFirstDayOfWeek" else {
                result(FlutterMethodNotImplemented)
                return
            }
            // iOS中NSCalendar.firstWeekday=1表示周日,2表示周一,转成0-based索引
            let firstDay = NSCalendar.current.firstWeekday
            result(firstDay - 1)
        })

        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

关键说明

  • Android的Calendar.getInstance().firstDayOfWeek和iOS的NSCalendar.current.firstWeekday都会返回用户在系统日历中设置的每周第一天,不受Locale默认值影响。
  • 统一转成0-based索引(0=周日,1=周一),和Flutter原生的firstDayOfWeekIndex格式保持一致,方便后续业务逻辑处理。
  • 异常处理中fallback到MaterialLocalizations的默认值,避免原生调用失败导致功能不可用。

内容的提问来源于stack exchange,提问作者Dev Loots

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:35:27