[英]How to apply MVC or design pattern in flutter?
我正在尝试使用local_auth
package 包括生物特征认证。 这在应用程序启动时使用。 指纹用于确定用户是否是手机的所有者。 如果确认,他们将被带到主页。 下面的代码有效,但我想在下面的代码上应用的是MVC
或design pattern
。 有人可以指导我吗?
class LoginOptionState extends State<LoginOption> {
final LocalAuthentication auth = LocalAuthentication();
String _authorized = 'Not Authorized';
@override
Widget build(BuildContext context) {
return Scaffold(
body: new Container(
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Column(
children: <Widget>[
Text("Touch ID"),
SizedBox(height: 10),
GestureDetector(
child: Image.asset(
"assets/",
),
onTap: _authenticate),
],
),
],
),
)));
}
Future<void> _authenticate() async {
bool authenticated = false;
try {
authenticated = await auth.authenticateWithBiometrics(
localizedReason: 'Scan your fingerprint to authenticate',
useErrorDialogs: true,
stickyAuth: false);
} on PlatformException catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_authorized = authenticated
? Navigator.pushNamed(context, homePageViewRoute)
: 'Not Authorized';
});
}
}
使用 Greg Perry mvc_pattern的优秀库。 链接上提供了快速启动示例代码和说明。
正如这里所建议的,是经典计数器应用程序的快速启动示例,来自上面的链接:
风景:
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
// Fields in a Widget subclass are always marked "final".
static final String title = 'Flutter Demo Home Page';
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final Controller _con = Controller.con;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
widget.title,
),
Text(
'${_con.counter}',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(
_con.incrementCounter
);
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
Controller class:
class Controller extends ControllerMVC {
/// Singleton Factory
factory Controller() {
if (_this == null) _this = Controller._();
return _this;
}
static Controller _this;
Controller._();
/// Allow for easy access to 'the Controller' throughout the application.
static Controller get con => _this;
int get counter => _counter;
int _counter = 0;
void incrementCounter() => _counter++;
}
现在重构上面的代码,添加一个 model:
int get counter => Model.counter;
void incrementCounter() {
/// The Controller knows how to 'talk to' the Model. It knows the name, but Model does the work.
Model._incrementCounter();
}
最后是 model class:
class Model {
static int get counter => _counter;
static int _counter = 0;
static int _incrementCounter() => ++_counter;
}
但是请确保将 flutter 升级到版本 1.13.0。 至少对我来说,我在较低版本中遇到了几个构建错误。
Karee 是一套在 Flutter 中实现 MVC 设计的工具。 它可以帮助您管理控制器、路线、屏幕等。 请参阅 karee github wiki 以获取文档。
您可以使用Karee 。 支持Flutter 2.XX
要安装运行npm install -g karee
然后 karee karee create
在基于 Karee 创建一个新的 Flutter 项目后,您可以添加新的 controller
示例代码
创建à新的controller
Karee generate --controller --path auth Authentication
lib/app/controllers/auth/AuthenticationController下生成的文件
@Controller
class AuthenticationController {
login(username, password) {
/// Your custom code
}
}
添加路线
Route.on('/login', 'AuthenticationController@login');
在您的屏幕中使用
var authUser = KareeRouter.goto('/login', parameter:[username, password]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.