本文将带你深入了解 Flutter 常用功能学习,涵盖从环境搭建到常用功能的详细介绍。我们将探讨如何安装 Flutter 环境并创建第一个 Flutter 项目,同时介绍布局与样式的常用方法。文章还将讲解导航与路由、状态管理以及数据处理与网络请求等核心内容。
Flutter简介与环境搭建 Flutter是什么Flutter 是由 Google 开发的一套开源用户界面工具包,它允许你使用一套代码库来开发 Android、iOS、Web、桌面(Windows、macOS、Linux)和嵌入式设备的应用程序。Flutter 使用 Dart 语言编写,支持热重载功能,使得开发者可以快速迭代代码,查看效果,极大地提高了开发效率。
安装Flutter安装 Flutter 需要先确保你的开发环境满足以下条件:
- 操作系统:Windows、macOS 或 Linux
- Dart SDK:Flutter 包含了 Dart SDK,但确保系统已安装最新版本的 Dart SDK。
- Android 开发环境:安装 Android Studio 和 Android SDK。
- iOS 开发环境:在 macOS 上安装 Xcode。
- 配置环境变量:将 Flutter SDK 所在目录路径添加到系统环境变量中。
- 安装 Flutter:从 Flutter 的 GitHub 仓库下载最新版本,解压后将 SDK 目录添加到环境变量中。
- 初始化 Flutter:运行
flutter doctor
命令,检查 Flutter 是否安装成功。 - 安装依赖包:根据
flutter doctor
输出的信息,安装所需的依赖包。 - 安装 Flutter IDE 插件:在编辑器中安装 Flutter 插件,支持实时热重载。
示例代码:检查 Flutter 是否安装成功
在命令行中,输入以下命令检查 Flutter 是否安装成功:
flutter doctor
运行命令后,会输出当前开发环境下的所有依赖项检查报告,如果所有依赖项都已安装成功,则会显示所有检查项已通过,否则会提示缺失的依赖项。
创建第一个Flutter项目使用命令行工具创建一个 Flutter 项目,例如创建一个名为 my_flutter_app
的 Flutter 项目,可以在命令行输入以下命令:
flutter create my_flutter_app
命令执行后,会在当前目录下创建一个名为 my_flutter_app
的项目文件夹,并自动打开编辑器。
示例代码:创建一个 Flutter 项目
创建 Flutter 项目后,项目文件夹包含以下结构:
my_flutter_app/
├── android/
├── ios/
├── lib/
│ └── main.dart
├── test/
└── pubspec.yaml
lib/main.dart
是项目的入口文件,pubspec.yaml
是项目的配置文件。
运行 Flutter 应用需要使用开发工具,如 Android Studio 或 VS Code。在开发工具中打开 Flutter 项目后,可以通过以下步骤运行和调试:
- 运行应用:在开发工具中点击运行按钮,或在命令行中输入
flutter run
,应用将自动安装到连接的设备或模拟器上运行。 - 热重载:在代码修改后,使用热重载功能实时查看效果。在开发工具中点击热重载按钮,或在命令行中输入
flutter run -d <device>
,并在修改后的代码处输入r
。 - 调试应用:在开发工具中打开调试模式,设置断点,使用调试工具进行调试。
示例代码:运行 Flutter 应用
在命令行中输入以下命令运行应用:
flutter run
在开发工具中,点击运行按钮运行应用。
示例代码:热重载
在修改了代码后,输入以下命令进行热重载:
```bash.
flutter run -d <device>
在开发工具中,点击热重载按钮运行应用。
### 示例代码:调试 Flutter 应用
在开发工具中打开调试模式,设置断点进行调试。
```dart
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
// 设置断点
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Text(
'Hello, World!',
style: Theme.of(context).textTheme.headline6,
),
),
);
}
}
在代码中设置断点后,点击调试按钮进行调试。
布局与样式 常用的布局方式在 Flutter 中,布局方式主要有 Row
、Column
、Stack
和 Expanded
等常用的布局组件。
示例代码:Row 布局
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: RowWidget(),
);
}
}
class RowWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Row Layout'),
),
body: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
width: 100.0,
height: 100.0,
color: Colors.red,
),
Container(
width: 100.0,
height: 100.0,
color: Colors.green,
),
Container(
width: 100.0,
height: 100.0,
color: Colors.blue,
),
],
),
);
}
}
示例代码:Column 布局
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ColumnWidget(),
);
}
}
class ColumnWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Column Layout'),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
width: 100.0,
height: 100.0,
color: Colors.red,
),
Container(
width: 100.0,
height: 100.0,
color: Colors.green,
),
Container(
width: 100.0,
height: 100.0,
color: Colors.blue,
),
],
),
);
}
}
示例代码:Expanded 布局
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ExpandedWidget(),
);
}
}
class ExpandedWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Expanded Layout'),
),
body: Column(
children: <Widget>[
Expanded(
child: Container(
color: Colors.red,
),
),
Expanded(
child: Container(
color: Colors.green,
),
),
Expanded(
child: Container(
color: Colors.blue,
),
),
],
),
);
}
}
自定义样式
在 Flutter 中,可以使用 Theme
和 ThemeData
来设置全局或局部的主题样式,也可以使用 Container
或 BoxDecoration
来设置组件的样式。
示例代码:全局主题样式
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
// 设置全局主题样式
primaryColor: Colors.red,
accentColor: Colors.green,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Text(
'Hello, World!',
style: Theme.of(context).textTheme.headline6,
),
),
);
}
}
示例代码:局部组件样式
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Container(
width: 200.0,
height: 200.0,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(10.0),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.5),
spreadRadius: 2,
blurRadius: 5,
offset: Offset(0, 3),
),
],
),
child: Center(
child: Text(
'Hello, World!',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
),
),
),
);
}
}
常用的Widget介绍
示例代码:常用的Widget
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Container(
width: 100.0,
height: 100.0,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(10.0),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.5),
spreadRadius: 2,
blurRadius: 5,
offset: Offset(0, 3),
),
],
),
child: Center(
child: Text(
'Hello, World!',
style: TextStyle(
color: Colors.white,
fontSize: 20.0,
fontWeight: FontWeight.bold,
),
),
),
),
RaisedButton(
onPressed: () {},
child: Text('Press me'),
),
],
),
),
);
}
}
导航与路由
页面导航
在 Flutter 中,可以使用 Navigator
来实现页面导航,通过 Navigator.push
方法将新的页面推入导航栈中,使用 Navigator.pop
方法将当前页面弹出。
示例代码:页面导航
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Next Page'),
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Back'),
),
),
);
}
}
路由管理
在 Flutter 中,可以使用 MaterialPageRoute
或者 PageRouteBuilder
来创建路由,并使用 Navigator
管理路由栈。
示例代码:路由管理
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/',
routes: {
'/': (context) => MyHomePage(title: 'Home Page'),
'/second': (context) => SecondPage(),
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pushNamed(context, '/second');
},
child: Text('Next Page'),
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Back'),
),
),
);
}
}
常用导航模式
在 Flutter 中常用的导航模式有 MaterialPageRoute
、CupertinoPageRoute
和 PageRouteBuilder
。
示例代码:导航模式
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/',
routes: {
'/': (context) => MyHomePage(title: 'Home Page'),
'/second': (context) => SecondPage(),
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () {
Navigator.pushNamed(context, '/second');
},
child: Text('Next Page'),
),
RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Next Page (MaterialPageRoute)'),
),
RaisedButton(
onPressed: () {
Navigator.push(
context,
CupertinoPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('Next Page (CupertinoPageRoute)'),
),
RaisedButton(
onPressed: () {
Navigator.push(
context,
PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => SecondPage(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
),
);
},
child: Text('Next Page (PageRouteBuilder)'),
),
],
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Back'),
),
),
);
}
}
状态管理
状态管理的基本概念
在 Flutter 中,状态管理是一个重要的概念,用于管理应用的状态,确保 UI 能够正确地反映数据的变化。常见的状态管理方式包括 InheritedWidget
、Provider
、Bloc
、Riverpod
等。
示例代码:InheritedWidget 状态管理
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class CounterWidget extends InheritedWidget {
final int counter;
CounterWidget({Key key, @required this.counter, @required Widget child}) : super(key: key, child: child);
static CounterWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<CounterWidget>();
}
@override
bool updateShouldNotify(CounterWidget oldWidget) {
return oldWidget.counter != counter;
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CounterWidget(
counter: 0,
child: MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _incrementCounter() {
CounterWidget.of(context).counter++;
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${CounterWidget.of(context).counter}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
示例代码:Provider 状态管理
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class Counter with ChangeNotifier {
int _counter = 0;
int get counter => _counter;
void increment() {
_counter++;
notifyListeners();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => Counter(),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${counter.counter}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counter.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
示例代码:Riverpod 状态管理
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
runApp(ProviderScope(child: MyApp()));
}
class CounterState {
int counter = 0;
}
class CounterNotifier extends StateNotifier<CounterState> {
CounterNotifier() : super(CounterState());
void increment() {
state.counter++;
}
}
final counterProvider = StateNotifierProvider<CounterNotifier, CounterState>((ref) {
return CounterNotifier();
});
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends ConsumerWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context, ScopedReader watch) {
final counter = watch(counterProvider);
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${counter.counter}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read(counterProvider.notifier).increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
示例代码:BLoC 状态管理
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
class CounterBloc {
final _counter = BehaviorSubject<int>.seeded(0);
Stream<int> get counterStream => _counter.stream;
void increment() {
_counter.add(_counter.value + 1);
}
void dispose() {
_counter.close();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = CounterBloc();
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page', bloc: bloc),
onGenerateRoute: (settings) {
return MaterialPageRoute<void>(
builder: (context) => MyHomePage(title: 'Flutter Demo Home Page', bloc: bloc),
settings: settings,
);
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title, this.bloc}) : super(key: key);
final String title;
final CounterBloc bloc;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
StreamBuilder<int>(
stream: widget.bloc.counterStream,
initialData: 0,
builder: (context, snapshot) {
return Text(
'Count: ${snapshot.data}',
style: Theme.of(context).textTheme.headline4,
);
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
widget.bloc.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
@override
void dispose() {
widget.bloc.dispose();
super.dispose();
}
}
数据处理与网络请求
JSON解析与数据模型
在 Flutter 中,可以使用 dart:convert
包中的 jsonDecode
和 jsonEncode
方法来解析和生成 JSON 数据。此外,可以使用 model
类来定义数据模型。
示例代码:JSON 解析
import 'dart:convert';
class User {
final int id;
final String name;
final String email;
User({this.id, this.name, this.email});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
name: json['name'],
email: json['email'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'email': email,
};
}
}
void main() {
var jsonStr = '{"id":1,"name":"John","email":"[email protected]"}';
var jsonMap = jsonDecode(jsonStr);
var user = User.fromJson(jsonMap);
print(user.id);
print(user.name);
print(user.email);
}
使用HTTP库进行网络请求
在 Flutter 中,可以使用 http
包进行网络请求。http
包提供了 get
、post
等方法来进行 HTTP 请求。
示例代码:HTTP 请求
import 'package:http/http.dart' as http;
import 'dart:convert';
Future<Map<String, dynamic>> fetchData() async {
var url = 'https://jsonplaceholder.typicode.com/todos/1';
var response = await http.get(url);
if (response.statusCode == 200) {
return json.decode(response.body);
} else {
throw Exception('Failed to load data');
}
}
void main() async {
var data = await fetchData();
print(data);
}
数据缓存
在 Flutter 中,可以使用 shared_preferences
包进行数据缓存。shared_preferences
包提供了 SharedPreferences
类,用于存储简单类型的数据。
示例代码:数据缓存
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() async {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _name;
Future<void> saveName(String name) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString('name', name);
}
Future<String> getName() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('name');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_name != null)
Text(
'Hello, $_name!',
style: Theme.of(context).textTheme.headline4,
),
TextField(
onChanged: (value) {
setState(() {
_name = value;
});
},
),
RaisedButton(
onPressed: () {
saveName(_name);
},
child: Text('Save'),
),
RaisedButton(
onPressed: () {
getName().then((value) {
setState(() {
_name = value;
});
});
},
child: Text('Load'),
),
],
),
),
);
}
}
共同學習,寫下你的評論
評論加載中...
作者其他優質文章