Flutter模板引擎插件angel3_jinja的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter模板引擎插件angel3_jinja的使用

Jinja视图模板插件

Pub版本(包括预发布版本) 空安全 Gitter 许可协议

此服务将Jinja2视图模板渲染为HTML,适用于Angel3框架。该插件是从Python端口到Dart的。

示例

import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_framework/http.dart';
import 'package:angel3_jinja/angel3_jinja.dart';
import 'package:path/path.dart' as p;

void main() async {
  var app = Angel();
  var http = AngelHttp(app);
  var viewsDir = p.join(
    p.dirname(
      p.fromUri(Platform.script),
    ),
    'views',
  );

  // 启用Jinja2视图
  await app.configure(jinja(path: viewsDir));

  // 添加路由。
  // 参考:https://github.com/ykmnkmi/jinja.dart/blob/master/example/bin/server.dart

  app
    ..get('/', (req, res) => res.render('index.html')) // 渲染index.html模板
    ..get('/hello', (req, res) => res.render('hello.html', {'name': 'user'})) // 渲染hello.html模板,并传递参数
    ..get('/hello/:name', (req, res) => res.render('hello.html', req.params)); // 渲染hello.html模板,并从路径参数中获取参数

  app.fallback((req, res) {
    res
      ..statusCode = 404
      ..write('404 Not Found :('); // 处理未找到资源的情况
  });

  // 启动服务器
  await http.startServer('127.0.0.1', 3000);
  print('Listening at ${http.uri}');
}

完整示例代码

import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_framework/http.dart';
import 'package:angel3_jinja/angel3_jinja.dart';
import 'package:path/path.dart' as p;

void main() async {
  var app = Angel(); // 创建一个Angel应用实例
  var http = AngelHttp(app); // 创建一个HTTP服务器实例
  
  // 获取views目录路径
  var viewsDir = p.join(
    p.dirname(
      p.fromUri(Platform.script), // 获取脚本文件所在目录
    ),
    'views',
  );

  // 启用Jinja2视图
  await app.configure(jinja(path: viewsDir));

  // 添加路由
  app
    ..get('/', (req, res) => res.render('index.html')) // 渲染index.html模板
    ..get('/hello', (req, res) => res.render('hello.html', {'name': 'user'})) // 渲染hello.html模板,并传递参数
    ..get('/hello/:name', (req, res) => res.render('hello.html', req.params)); // 渲染hello.html模板,并从路径参数中获取参数

  // 设置默认路由处理未找到资源的情况
  app.fallback((req, res) {
    res
      ..statusCode = 404
      ..write('404 Not Found :(');
  });

  // 启动HTTP服务器
  await http.startServer('127.0.0.1', 3000);
  print('Listening at ${http.uri}');
}

更多关于Flutter模板引擎插件angel3_jinja的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模板引擎插件angel3_jinja的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用angel3_jinja模板引擎插件的一个基本示例。angel3_jinja 是一个 Dart 语言版本的 Jinja2 模板引擎实现,通常用于服务器端渲染,但在 Flutter 中你也可以通过平台通道或其他方式使用它来进行一些模板渲染任务。

需要注意的是,直接在Flutter客户端应用中使用服务器端模板引擎可能并不是最佳实践,因为它通常用于服务器端渲染。然而,为了演示如何使用这个库,我们可以创建一个简单的例子。

步骤 1: 添加依赖

首先,在你的 pubspec.yaml 文件中添加 angel3_jinja 依赖。

dependencies:
  flutter:
    sdk: flutter
  angel3_jinja: ^x.y.z  # 替换为最新版本号

步骤 2: 导入库并配置模板引擎

接下来,在你的 Dart 文件中导入库并配置模板引擎。

import 'package:flutter/material.dart';
import 'package:angel3_jinja/angel3_jinja.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Angel3 Jinja Example'),
        ),
        body: Center(
          child: JinjaExample(),
        ),
      ),
    );
  }
}

class JinjaExample extends StatefulWidget {
  @override
  _JinjaExampleState createState() => _JinjaExampleState();
}

class _JinjaExampleState extends State<JinjaExample> {
  String? renderedTemplate;

  @override
  void initState() {
    super.initState();
    _renderTemplate();
  }

  Future<void> _renderTemplate() async {
    // 配置 Jinja 环境
    final env = Environment();

    // 加载模板字符串(实际应用中可以从文件或其他资源加载)
    final templateString = '''
      Hello, {{ name }}!
      You have {{ count }} new messages.
    ''';

    // 解析模板
    final template = env.fromString(templateString)!;

    // 渲染模板
    final context = Context({'name': 'Alice', 'count': 5});
    final result = await template.renderAsync(context);

    // 更新状态
    setState(() {
      renderedTemplate = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Rendered Template:'),
        Text(renderedTemplate ?? 'Loading...'),
      ],
    );
  }
}

注意事项

  1. 模板字符串:在这个例子中,模板字符串是直接在代码中定义的。在实际应用中,你可能希望从文件或其他资源中加载模板。

  2. 异步渲染renderAsync 方法是异步的,因为它可能涉及 I/O 操作(如从文件系统加载模板)。因此,我们使用 Futureasync/await 来处理异步操作。

  3. Flutter UI 更新:在渲染完成后,我们使用 setState 方法来更新 UI,以显示渲染后的模板内容。

  4. 错误处理:在实际应用中,你应该添加适当的错误处理逻辑,以处理模板解析或渲染过程中可能出现的错误。

这个例子演示了如何在 Flutter 应用中使用 angel3_jinja 模板引擎进行简单的模板渲染。然而,请记住,这种用法通常不是 Flutter 应用的最佳实践,因为 Flutter 更适合用于构建动态和交互式的客户端应用,而服务器端模板引擎更适合用于服务器端渲染。

回到顶部