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)
),
)