安卓商店在應用上架時會要求用戶清楚并授權之后才可收集用戶和設備信息,如mac地址 imei等
1、安卓開發(fā)者會在application中進行此操作遗遵,flutter應用可在main文件中添加授權對話框瘦材,
flutter的MyApp()可等同看作是應用的application入口尸疆。
在MyApp()中添加對話框臼膏,用戶點擊同意即進行部分三方插件的初始化硼被,如極光、融云等渗磅。
可在MyApp()的build的body中添加判斷嚷硫,初次安裝先處理授權框,同意后再正常初始化內容始鱼。
如果你的合規(guī)化對話框中沒有用戶協(xié)議和隱私政策仔掸,可不必將MyApp拆分為MyAppPrepare的子項。
代碼如下:
void main() async{
? await setupServiceLocator();//后臺音頻播放初始化
? runApp(MultiProvider(
? ? providers: [
? ? ? ChangeNotifierProvider(create: (_) => UserProvider()),
? ? ],
? ? child: MyAppPrepare(),//解決MaterialApp中的跳轉路由的context問題
? ));
}
///解決MaterialApp中的跳轉路由的context問題
class MyAppPrepare extends StatelessWidget {
? @override
? Widget build(BuildContext context) {
? ? return MaterialApp(
? ? ? debugShowCheckedModeBanner: false,
? ? ? builder: (context, widget) {
? ? ? ? return MediaQuery(
? ? ? ? ? ///設置文字大小不隨系統(tǒng)設置改變
? ? ? ? ? data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
? ? ? ? ? child: FlutterEasyLoading(child: widget),
? ? ? ? );
? ? ? },
? ? ? home: MyApp(),
? ? ? theme: ThemeData(primarySwatch: ColorTool.white),
? ? ? localizationsDelegates: [? ?//國際化
? ? ? ? RefreshLocalizations.delegate,
? ? ? ? GlobalMaterialLocalizations.delegate,
? ? ? ? GlobalWidgetsLocalizations.delegate,
? ? ? ? CupertinoLocalizationsDelegate(),
? ? ? ],
? ? ? supportedLocales: [Locale('zh', 'CN')],
? ? );
? }
}
class MyApp extends StatefulWidget {
? @override
? State<StatefulWidget> createState() {
? ? return _MyAppState();
? }
? static BuildContext getContext() {
? ? return _MyAppState.getContext();
? }
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver{
? RouteManager _routeDelegate = RouteManager();
static BuildContext appContext;
? static BuildContext getContext() {
? ? return appContext;
? }
? @override
? void initState() {
? ? super.initState();
? ? //添加觀察者风响,檢測頁面生命周期
? ? WidgetsBinding.instance.addObserver(this);
? ? EventBusUtils _event = EventBusUtils.instance;
? ? if (CacheManager.shared.prefs != null && CacheManager.shared.getString("isShowAgreement") != null) {
? ? ? _prepareInitIM(); //初始化融云IM
? ? }
? }
? @override
? void dispose() {
? ? super.dispose();
? ? //頁面銷毀時嘉汰,移出頁面生命周期監(jiān)聽者
? ? WidgetsBinding.instance?.removeObserver(this);
? }
? @override
? Widget build(BuildContext context) {
? ? appContext = context;
? ? return FutureBuilder<CacheManager>(
? ? ? future: CacheManager.preInit(context),//進行數據初始化丹禀,極光初始化状勤,如SharedPreferences
? ? ? builder: (BuildContext context, AsyncSnapshot<CacheManager> snapshot) {
? ? ? ? var _widget = (snapshot.connectionState == ConnectionState.done &&
? ? ? ? ? ? ? ? snapshot.data != null)
? ? ? ? ? ? ? Router(routerDelegate: _routeDelegate)
? ? ? ? ? ? : snapshot.connectionState != ConnectionState.done
? ? ? ? ? ? ? Scaffold(
? ? ? ? ? ? ? ? ? ? body: Center(
? ? ? ? ? ? ? ? ? ? ? child: CircularProgressIndicator(color: ColorTool.red),
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? :_showAgreementWindow(appContext);? //顯示用戶授權框,應用合規(guī)化
? ? ? ? return _widget;
? ? ? },
? ? );
? }
_showAgreementWindow()方法未貼出双泪,可自行編寫一個你需要的樣式持搜。
為什么將MyApp()分為兩個是因為你的合規(guī)化對話框中應該存在用戶協(xié)議和隱私政策,這樣做是為了將?MaterialApp 內容使用 StatelessWeight 包裹一層焙矛,解決Navigator operation requested with a context that does not include a Navigator.問題葫盼。即:使用路由(Navigator),根控件不能直接是 MaterialApp.