tcmpp_flutter 2.4.3 copy "tcmpp_flutter: ^2.4.3" to clipboard
tcmpp_flutter: ^2.4.3 copied to clipboard

TCSAS Flutter SDK.

example/lib/main.dart

import 'dart:ffi';
import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:tcmpp_flutter/tcmpp_flutter.dart';
import 'db/info_config_db.dart';
import 'login/login_page.dart';
import 'home/home_page.dart';
import 'login/login_service.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:tcmpp_flutter_example/app_localizations.dart';
export 'main.dart' show _MyAppState;
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp(await navigateToInitialPage()));
}

class MyApp extends StatefulWidget {
  final Widget initialPage;

  MyApp(this.initialPage);

  @override
  MyAppState createState() => MyAppState(initialPage);
}

class MyAppState extends State<MyApp> {
  final Widget initialPage;
  final ValueNotifier<Locale> _localeNotifier = ValueNotifier(Locale('en', ''));

  Locale _currentLocale = Locale('en', '');

  // 调用 example 内 Android 原生的语言设置 API(让 Locale.getDefault() / Context 资源使用 app 语言)
  static const MethodChannel _nativeLocaleChannel = MethodChannel('com.tcmpp.demo/locale');

  MyAppState(this.initialPage);

  @override
  void initState() {
    super.initState();
    _applySavedLocale();
  }

  Future<void> _applySavedLocale() async {
    final languageCode = await InfoConfigDb.getLocalLanguageCode() ?? 'en';
    final regionCode = await InfoConfigDb.getLocalCountryCode() ?? 'us';
    if (languageCode.isNotEmpty) {
      await changeLanguage(Locale(languageCode, regionCode));
    }
  }

  Future<void> changeLanguage(Locale newLocale) async {
    _localeNotifier.value = newLocale;
    TcmppFlutter().setLocale(newLocale.languageCode, region: newLocale.countryCode ?? "");
    await InfoConfigDb.setLocale(newLocale.languageCode, newLocale.countryCode ?? "");
    if (Platform.isAndroid) {
      await _nativeLocaleChannel.invokeMethod('setLocale', {
        'language': newLocale.languageCode,
        'region': newLocale.countryCode ?? "",
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    return ValueListenableBuilder<Locale>(
      valueListenable: _localeNotifier,
      builder: (context, locale, child) {
        _currentLocale = locale;
        return MaterialApp(
          locale: _currentLocale,
          home: initialPage,
          routes: {
            '/home': (context) => HomePage(key: UniqueKey()),
            '/login': (context) => LoginPage(key: UniqueKey()),
          },
          localizationsDelegates: [
            AppLocalizationsDelegate(),
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            const Locale('en', ''),
            const Locale('zh', 'CN'),
            const Locale('fr', ''),
            const Locale('id', ''),
          ],
        );
      },
    );
  }

  Future<void> setLocal() async {
    String languageCode = await InfoConfigDb.getLocalLanguageCode() ?? 'en';
    String regionCode = await InfoConfigDb.getLocalCountryCode() ?? 'us';
    await changeLanguage(Locale(languageCode, regionCode));
  }
}

Future<Widget> navigateToInitialPage() async {
  String? userAccount = await LoginService.getUserToken();
  String? account = await LoginService.getUserAccount();
  if (userAccount != null && userAccount.isNotEmpty && account != null && account.isNotEmpty) {
    return FutureBuilder<bool>(
      future: LoginService.login(account),
      builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return HomePage(key: UniqueKey());
        } else if (snapshot.hasError) {
          return LoginPage(key: UniqueKey());
        } else {
          return HomePage(key: UniqueKey());
        }
      },
    );
  } else {
    return LoginPage(key: UniqueKey());
  }
}