alibaba / alibaba/flutter_boost
升级4.0+后获取不到设置的 ui.window.locale
- Dominant language
- Dart
- Stars
- 7.2k
- Forks
- 1.3k
- PR merge metrics
- No merged PRs in 30d
Description
## Steps to Reproduce
1、MainActivity继承了FlutterBoostActivity 并重写 attachBaseContext
```kotlin
package com.example.my_app
import android.content.Context
import android.content.ContextWrapper
import android.os.Build
import android.os.LocaleList
import android.util.Log
import com.idlefish.flutterboost.containers.FlutterBoostActivity
import io.flutter.embedding.android.FlutterActivity
import java.util.*
class MainActivity: FlutterBoostActivity() {
override fun attachBaseContext(context: Context?) {
val newLocale = Locale.ENGLISH
val configuration = context?.resources?.configuration
Log.d("FlutterBoostActivity","attachBaseContext:${newLocale.language}")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
configuration?.setLocale(newLocale)
val localeList = LocaleList(newLocale)
LocaleList.setDefault(localeList)
configuration?.setLocales(localeList)
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration?.setLocale(newLocale)
}
Locale.setDefault(newLocale)
}
val contextL = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration?.let { context.createConfigurationContext(it) }
} else {
context
};
super.attachBaseContext(ContextWrapper(contextL))
}
}
```
2、修改引擎Intent
```kotlin
package com.example.my_app
import android.app.Application
import android.content.Intent
import com.idlefish.flutterboost.FlutterBoost
import com.idlefish.flutterboost.FlutterBoostDelegate
import com.idlefish.flutterboost.FlutterBoostRouteOptions
import com.idlefish.flutterboost.containers.FlutterBoostActivity
import io.flutter.embedding.android.FlutterActivityLaunchConfigs
import io.flutter.embedding.engine.FlutterEngine
/**
* Created by mars on 5/16/23 17:10.
*/
class App : Application() {
override fun onCreate() {
super.onCreate()
FlutterBoost.instance().setup(this, object : FlutterBoostDelegate {
override fun pushNativeRoute(options: FlutterBoostRouteOptions) {
}
override fun pushFlutterRoute(options: FlutterBoostRouteOptions) {
val intent = FlutterBoostActivity.CachedEngineIntentBuilder(
MainActivity::class.java
)
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.opaque)
.destroyEngineWithActivity(true)
.uniqueId(options.uniqueId())
.url(options.pageName())
.urlParams(options.arguments())
.build(FlutterBoost.instance().currentActivity())
FlutterBoost.instance().currentActivity().startActivity(intent)
}
}, FlutterBoost.Callback { engine: FlutterEngine? -> })
}
}
```
3、在main.dart 打印ui.window.local 内容
```dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart';
import 'dart:ui' as ui;
void main() {
///这里的CustomFlutterBinding调用务必不可缺少,用于控制Boost状态的resume和pause
CustomFlutterBinding();
runApp(MyApp());
}
///创建一个自定义的Binding,继承和with的关系如下,里面什么都不用写
class CustomFlutterBinding extends WidgetsFlutterBinding
with BoostFlutterBinding {}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State {
/// 由于很多同学说没有跳转动画,这里是因为之前exmaple里面用的是 [PageRouteBuilder],
/// 其实这里是可以自定义的,和Boost没太多关系,比如我想用类似iOS平台的动画,
/// 那么只需要像下面这样写成 [CupertinoPageRoute] 即可
/// (这里全写成[MaterialPageRoute]也行,这里只不过用[CupertinoPageRoute]举例子)
///
/// 注意,如果需要push的时候,两个页面都需要动的话,
/// (就是像iOS native那样,在push的时候,前面一个页面也会向左推一段距离)
/// 那么前后两个页面都必须是遵循CupertinoRouteTransitionMixin的路由
/// 简单来说,就两个页面都是CupertinoPageRoute就好
/// 如果用MaterialPageRoute的话同理
Map routerMap = {
'mainPage': (RouteSettings settings, String? uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (_) {
Map map =
(settings.arguments ?? {'data': ''}) as Map;
String data = map['data'] as String;
return MainPage(
data: data,
);
});
},
'simplePage': (settings, uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (_) {
Map map =
(settings.arguments ?? {'data': ''}) as Map;
String data = map['data'] as String;
return SimplePage(
data: data,
);
});
},
};
Route? routeFactory(RouteSettings settings, String? uniqueId) {
FlutterBoostRouteFactory func =
routerMap[settings.name] as FlutterBoostRouteFactory;
return func(settings, uniqueId);
}
Widget appBuilder(Widget home) {
return MaterialApp(
home: home,
debugShowCheckedModeBanner: true,
///必须加上builder参数,否则showDialog等会出问题
builder: (_, __) {
return home;
},
);
}
@override
Widget build(BuildContext context) {
Locale locale = ui.window.locale;
print("Flutter languageCode: ${locale.languageCode}${locale.countryCode}");
return FlutterBoostApp(
routeFactory,
initialRoute: "mainPage",
appBuilder: appBuilder,
);
}
}
class MainPage extends StatelessWidget {
const MainPage({Object? data});
@override
Widget build(BuildContext context) {
Locale locale = ui.window.locale;
print(
"MainPage Flutter languageCode: ${locale.languageCode}${locale.countryCode}");
return const Scaffold(
body: Center(child: Text('Main Page')),
);
}
}
class SimplePage extends StatelessWidget {
const SimplePage({Object? data});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(child: Text('SimplePage')),
);
}
}
```
**Flutter Boost Version: 4.2.2**
**Target Platform: Android**
**Target OS version/browser: Android 13**
**Devices: Android**
**Flutter SDK: 3.3.10**
## Logs
```
D/FlutterBoostActivity: attachBaseContext:en
I/flutter: Flutter languageCode: zhCN
```
## 使用FlutterBoost 3.0+,ui.window.locale.languageCode 能够正常显示`en`
## 移除Flutter Boost,使用FlutterActivity复写 attachBaseContext修改locale为Locale.ENGLISH后,main.dart 也能正常显示`en`
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reproducing the Android 13 case from MainActivity.attachBaseContext and the FlutterBoost setup in App, then inspect the locale reads in main.dart and MainPage. Compare FlutterBoostActivity with FlutterActivity using Flutter Boost 4.2.2 and Flutter 3.3.10. Done means ui.window.locale reports the configured English locale when FlutterBoost is used, with the relevant behavior covered by a regression test.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, dart, kotlin
- Domain
- internationalization, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100