Flutter是一款由Google開發的UI工具包,可以創建高性能、高保真度的移動應用程序。當然,Flutter也有自己的社區生態,FlutterStack就是其中之一。本文將從不同的方面對FlutterStack做詳細的闡述。
一、點擊穿透
點擊穿透指的是用戶在點擊了一個可交互的widget但其下方還有一個位於相同位置並且可交互的widget,此時會出現優先響應下層widget的現象。在Flutter開發中,為了解決這個問題,我們可以使用IgnorePointer或AbsorbPointer widget。IgnorePointer會忽略所有的用戶事件,AbsorbPointer會攔截所有的用戶事件。
@override
Widget build(BuildContext context) {
return Stack(
children: [
// 下方widget
Positioned(
top: 0,
left: 0,
right: 0,
bottom: 0,
child: GestureDetector(
onTap: () {
print("click bottom widget");
},
),
),
// 上方widget
Positioned(
top: 0,
left: 0,
right: 0,
bottom: 0,
child: IgnorePointer(
child: GestureDetector(
onTap: () {
print("click top widget");
},
),
),
),
],
);
}
二、路由傳參
在Flutter中,路由管理是非常重要的,通過路由可以實現頁面之間的跳轉。在路由的跳轉過程中需要傳遞參數,這時可以使用FlutterStack庫中的ArgumentWidget和ArgumentExtractor。ArgumentWidget用來傳遞參數,ArgumentExtractor用來提取參數。例如:
class SecondPage extends StatelessWidget with ArgumentWidget {
final String name;
SecondPage(this.name);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("SecondPage"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context, "Hello, $name!");
},
child: Text("返回並傳遞參數"),
),
),
);
}
@override
Map argument() {
return {"name": name};
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("FirstPage"),
),
body: Center(
child: RaisedButton(
onPressed: () async {
final result = await Navigator.push(context, MaterialPageRoute(builder: (ctx) => SecondPage("FlutterStack")));
print(result);
final argument = ArgumentExtractor.extract(result);
print(argument["name"]);
},
child: Text("跳轉到SecondPage"),
),
),
);
}
}
三、網絡請求
FlutterStack中提供了一個便捷的網絡請求工具類,可以方便的進行網絡請求。例如:
static Future get(String url, {Map params, Map headers}) async {
var client = new http.Client();
try {
var response = await client.get(_buildUrl(url, params), headers: headers);
return _handleResponse(response);
} catch (e) {
return {"code": -1, "msg": e.toString()};
} finally {
client.close();
}
}
static Future post(String url, {Map params, Map headers}) async {
var client = new http.Client();
try {
var response = await client.post(url, body: params, headers: headers);
return _handleResponse(response);
} catch (e) {
return {"code": -1, "msg": e.toString()};
} finally {
client.close();
}
}
使用方法也非常簡單:
void _getData() async {
final result = await HttpManager.get("https://www.baidu.com");
print(result);
}
四、國際化
在開發中,有時需要我們的應用支持多語言,FlutterStack提供了一個簡單易用的國際化工具。通過以下步驟,可以在應用中實現多語言:
1. 在pubspec.yaml文件中添加依賴項:
dependencies:
flutter_localizations:
sdk: flutter
2. 在main函數中添加如下代碼:
void main() {
runApp(
MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
FallbackCupertinoLocalisationsDelegate(),
],
supportedLocales: [const Locale('en', ''), const Locale('zh', '')],
home: MyApp(),
),
);
}
3. 在lib目錄下創建一個l10n目錄,用於存放多語言文件,例如lib/l10n/messages_en.dart和lib/l10n/messages_zh.dart。
4. 在消息文件中添加多語言翻譯:
class Messages {
static const String appTitle = "FlutterStack";
static const String welcomeMessage = "Welcome";
static const String language = "Language";
static const String english = "English";
static const String chinese = "中文";
static String localeMessage(String language) {
return "你選擇了${language}";
}
}
5. 在需要使用的widget中使用FlutterStack提供的TranslationWidget,例如:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(Messages.appTitle),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(Messages.welcomeMessage),
SizedBox(height: 20),
TranslationWidget(
builder: (BuildContext context, String value) {
return Text(value);
},
translation: Messages.language,
),
SizedBox(height: 20),
TranslationWidget(
builder: (BuildContext context, String value) {
return Text(value);
},
translation: Messages.localeMessage("FlutterStack"),
),
],
),
);
}
}
五、動畫效果
Flutter的動畫效果非常豐富,通過FlutterStack中提供的AnimatedWidget和AnimationController可以實現各種複雜的動畫效果。例如:
class AnimatedLogo extends AnimatedWidget {
AnimatedLogo({Key key, Animation animation}) : super(key: key, listenable: animation);
@override
Widget build(BuildContext context) {
final Animation animation = listenable;
return Center(
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: animation.value,
width: animation.value,
child: FlutterLogo(),
),
);
}
}
class LogoApp extends StatefulWidget {
@override
_LogoAppState createState() => _LogoAppState();
}
class _LogoAppState extends State with TickerProviderStateMixin {
AnimationController controller;
Animation animation;
@override
void initState() {
super.initState();
controller = AnimationController(vsync: this, duration: Duration(seconds: 2));
animation = Tween(begin: 0.0, end: 200.0).animate(controller);
controller.forward();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("AnimatedLogo"),
),
body: AnimatedLogo(
animation: animation,
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
}
六、總結
本文從多個方面對FlutterStack做了詳細的闡述,包括點擊穿透、路由傳參、網絡請求、國際化以及動畫效果等。通過對FlutterStack的了解,可以更加方便地進行Flutter開發,提高開發效率。
原創文章,作者:UOGAO,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/334274.html
微信掃一掃
支付寶掃一掃