flutter常见问题

696 阅读2分钟

flutter run长时间卡在Running Gradle task “assembleDebug”

gradle仓库问题,将maven仓库替换为以下(参考文章:卡在Running Gradle task “assembleDebug”

maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }

Flutter-根据登录状态使用不同展示不同页面

参考文章:Flutter-根据登录状态使用不同的路线启动应用

思路:在main方法里判断用户当前是否登录,如果登录,则将路由改为home,没有登录改为login。

注意事项:

1、由于SharedPreferences是异步的,所以在main里使用他,需要将main方法定义为异步方法。而且请在void main() async {之前添加WidgetsFlutterBinding.ensureInitialized();

2、myApp在构造函数中传递初始路由

void main() async {  
  WidgetsFlutterBinding.ensureInitialized();  //必须
  final Auth _auth = Auth();  
  final bool isLogged = await _auth.isLogged();  
  final MyApp myApp = MyApp(  
    initialRoute: isLogged ? '/home' : '/',  
  );  
  runApp(myApp);  
}
class MyApp extends StatelessWidget {  
  final String initialRoute;  
  
  MyApp({this.initialRoute});  
  
  @override  
  Widget build(BuildContext context) {  
    return MaterialApp(  
      title: 'Dynamic Route Demo',  
      initialRoute: initialRoute,  //使用初始路由
      routes: {  
        '/': (context) => LoginPage(),  
        '/home': (context) => HomePage(),  
        '/settings': (context) => SettingsPage(),  
      },  
    );  
  }  
}

Flutter 返回桌面不退出app

参考文章:Flutter 返回桌面不退出app

思路:flutter与原生交互。

1、原生添加代码

2、自定义dart类

3、在dart用使用

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant.*
 
class MainActivity: FlutterActivity() {
    //通讯名称,回到手机桌面
    private val CHANNEL = "android/back/desktop"
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        registerWith(flutterEngine);
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { methodCall, result ->
            if (methodCall.method == "backDesktop") {
                result.success(true)
                moveTaskToBack(false)
            }
        }
    }
}
// dart类
import 'package:flutter/services.dart';
 
class AndroidBackDesktop{
  //通讯名称,回到手机桌面
  static const String CHANNEL = "android/back/desktop";
  //设置回退到手机桌面事件
  static const String eventBackDesktop = "backDesktop";
 
  //设置回退到手机桌面方法
  static Future<bool> backToDesktop() async {
    final platform = MethodChannel(CHANNEL);
    //通知安卓返回到手机桌面
    try{
      await platform.invokeMethod(eventBackDesktop);
      print("通信成功");
    }
    on PlatformException catch (e){
      print("通信失败,设置回退到安卓手机桌面失败");
      print(e.toString());
    }
    return Future.value(false);
  }
}
 @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        AndroidBackDesktop.backToDesktop(); //设置为返回不退出app
        return false; //一定要return false
      },
      child:Text('fdsa'),
    );
  }

flutter 设置沉浸式状态栏(Status Bar)

参考文章:设置沉浸式状态栏(Status Bar)

全局设置

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

void main(){
  runApp(MyApp());

  if(Platform.isAndroid){
    SystemUiOverlayStyle style = SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      ///这是设置状态栏的图标和字体的颜色 
      ///Brightness.light  一般都是显示为白色
      ///Brightness.dark 一般都是显示为黑色
      statusBarIconBrightness: Brightness.light
    );
    SystemChrome.setSystemUIOverlayStyle(style);
  }
}

单个页面

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

class test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
    return Text('Body');
  }
}

brightness' is deprecated and shouldn't be used. This property is no longer used, please use systemOverlayStyle instead.

参考链接:stackoverflow.com/questions/5…

AppBar(
  systemOverlayStyle: SystemUiOverlayStyle(
    // Status bar color
    statusBarColor: Colors.red, 
    // Status bar brightness (optional)
    statusBarIconBrightness: Brightness.dark, // For Android (dark icons)
    statusBarBrightness: Brightness.light, // For iOS (dark icons)
  ),
)