面试题答案
一键面试使用Future进行异步数据加载流程
- 定义加载函数:在Dart中,使用
async
关键字定义一个异步函数,函数返回一个Future
对象。 - 执行异步操作:在
async
函数内部,使用await
关键字等待异步操作完成,如网络请求。 - 处理结果:获取异步操作的结果并进行相应处理。
关键代码片段
Future<UserData> fetchUserData() async {
// 模拟网络请求,实际中可能使用http等库
await Future.delayed(const Duration(seconds: 2));
return UserData('John Doe', 30);
}
class UserData {
final String name;
final int age;
UserData(this.name, this.age);
}
解释:fetchUserData
函数使用async
定义为异步函数,await Future.delayed
模拟网络请求的延迟。返回UserData
对象。
多语言切换时确保数据适配新语言
- 使用Flutter的国际化库:引入
flutter_localizations
库。 - 定义字符串资源:在
arb
文件中定义不同语言的字符串资源。 - 动态更新语言:通过
Localizations.of
方法获取当前语言环境,并根据语言环境动态更新数据显示。
关键代码片段
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Locale _locale = Locale('en');
void setLocale(Locale locale) {
setState(() {
_locale = locale;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en'),
Locale('zh'),
],
locale: _locale,
home: Scaffold(
appBar: AppBar(
title: Text('多语言示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => setLocale(Locale('en')),
child: Text('英文'),
),
ElevatedButton(
onPressed: () => setLocale(Locale('zh')),
child: Text('中文'),
),
FutureBuilder<UserData>(
future: fetchUserData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Text(
// 根据语言环境获取不同的文本显示
Localizations.localeOf(context).languageCode == 'en'
? 'Name: ${snapshot.data!.name}, Age: ${snapshot.data!.age}'
: '姓名: ${snapshot.data!.name}, 年龄: ${snapshot.data!.age}',
);
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
}
return CircularProgressIndicator();
},
)
],
),
),
),
);
}
}
解释:在MyApp
中,通过setLocale
方法动态更新语言。FutureBuilder
用于异步加载用户数据,在构建数据显示时,根据当前语言环境Localizations.localeOf(context).languageCode
来决定显示英文还是中文文本。