Flutter集成Django后端插件djangoflow_app的使用

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

Flutter集成Django后端插件djangoflow_app的使用

简介

djangoflow_app 是一个简单的、有明确意见的和极简的Flutter应用程序结构,旨在快速启动和易于维护。

开始使用

pubspec.yaml 文件中添加 djangoflow_app 作为依赖项。

dependencies:
  djangoflow_app: <最新版本>

导入 djangoflow_app 并使用它来创建你的根 StatelessWidget

import 'package:djangoflow_app/djangoflow_app.dart';

void main() => DjangoflowAppRunner.run(
      onException: (exception, stackTrace) {
        // 自定义异常处理
      },
      rootWidgetBuilder: (appBuilder) async {
        return MaterialApp(
          title: 'Djangoflow App',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: appBuilder(AppBuilder(
            repositoryProviders: [
              // 你的仓库提供者
            ],
            providers: [
              // 你的BLoC提供者
            ],
            listeners: [
              // 你的BLoC监听器
            ],
            builder: (context) => YourRootWidget(),
          )),
        );
      },
    );

特性

AppBuilder

AppBuilder 是一个自定义的 StatelessWidget,允许你在一处提供全局的 BlocProviderBlocListenerRepositoryProvider 以及 initStatedispose 的回调。

AppCubitBuilder, AppCubitConsumer, 和 AppCubitListener

这是一组自定义的 BlocBuilderBlocConsumerBlocListener,允许你监听 AppCubit 的状态变化。

DjangoflowAppRunner

DjangoflowAppRunner 是一个自定义的 runApp,允许你在整个应用范围内全局处理异常,并设置 HydratedBloc 存储和 BlocObserver

DjangoflowAppSnackbar

DjangoflowAppSnackbar 是一个简单的 SnackBar 管理器,允许你全局显示不同类型的 SnackBar(信息、错误、应用内通知)。

SandboxBanner

SandboxBanner 是一个简单的横幅,允许你在屏幕的左上角显示带有自定义消息和颜色的横幅。它有助于指示当前环境(例如,沙盒、生产)。

EnvSwitcher

EnvSwitcher 是一个简单的组件,允许你通过长按切换不同的环境。

注意事项

DjangoflowAppSnackbar 使用 ScaffoldMessengerDjangoflowAppSnackbar 的全局键需要提供给 MaterialAppscaffoldMessengerKey

完整示例代码

以下是一个完整的示例代码:

import 'package:djangoflow_app/djangoflow_app.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

void main() {
  DjangoflowAppRunner.run(
    onException: (exception, stackTrace) {
      DjangoflowAppSnackbar.showError(exception.toString());
    },
    rootWidgetBuilder: (builder) => builder(
      AppBuilder(
        blocProviders: [
          BlocProvider<AppCubit>(create: (context) => AppCubit.instance),
        ],
        blocListeners: [
          BlocListener<AppCubit, AppState>(
            listenWhen: (previous, current) =>
                previous.environment != current.environment,
            listener: (context, state) {
              DjangoflowAppSnackbar.showInAppNotification(
                title: 'Environment Changed',
                body: 'App is in ${state.environment.name} environment now.',
              );
            },
          ),
        ],
        builder: (context) => AppCubitBuilder(
          builder: (context, state) => MaterialApp(
            theme: ThemeData(),
            scaffoldMessengerKey: DjangoflowAppSnackbar.scaffoldMessengerKey,
            debugShowCheckedModeBanner: false,
            darkTheme: ThemeData.dark(),
            themeMode: state.themeMode,
            home: Scaffold(
              appBar: AppBar(
                title: const Text('Djangoflow App'),
                actions: const [
                  _ToggleThemeModeButton(
                    key: Key('theme_toggle'),
                  ),
                ],
              ),
              body: SafeArea(
                child: ListView(
                  padding: const EdgeInsets.all(16),
                  children: [
                    const _EnvironmentToggle(key: Key('environment_toggle')),
                    const SizedBox(height: 16),
                    ElevatedButton(
                      child: const Text('Throw exception'),
                      onPressed: () => throw Exception('Test exception'),
                    ),
                  ],
                ),
              ),
            ),
            builder: (context, child) => SandboxBanner(
              isSandbox: state.environment == AppEnvironment.sandbox,
              child: child ?? const SizedBox.shrink(),
            ),
          ),
        ),
      ),
    ),
  );
}

class _ToggleThemeModeButton extends StatelessWidget {
  const _ToggleThemeModeButton({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) => AppCubitBuilder(
        builder: (context, state) => IconButton(
          onPressed: () => context.read<AppCubit>().updateThemeMode(
                state.themeMode == ThemeMode.dark
                    ? ThemeMode.light
                    : ThemeMode.dark,
              ),
          icon: Icon(
            state.themeMode == ThemeMode.dark
                ? Icons.light_mode
                : Icons.dark_mode,
          ),
        ),
      );
}

class _EnvironmentToggle extends StatelessWidget {
  const _EnvironmentToggle({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) => const EnvSwitcher(
        child: ListTile(
          title: Text('Long press to toggle environment'),
        ),
      );
}

更多关于Flutter集成Django后端插件djangoflow_app的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Django后端插件djangoflow_app的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成Django后端插件(假设你提到的djangoflow_app是一个Django应用,而不是一个直接用于Flutter的插件),通常涉及几个步骤,包括设置Django后端API、在Flutter前端调用这些API以及处理数据。由于djangoflow_app不是一个标准或广泛认可的Flutter插件,我将提供一个通用的集成方法,你可以根据djangoflow_app的具体API进行调整。

1. 设置Django后端API

首先,确保你的Django项目已经设置好并运行。然后,你可以创建一个Django应用(如果还没有的话),并定义你的API端点。例如,使用Django REST framework(DRF)来创建API:

settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
    'your_app_name',  # 替换为你的应用名称
]

urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from your_app_name.views import YourModelViewSet  # 替换为你的视图集

router = DefaultRouter()
router.register(r'your-models', YourModelViewSet)  # 注册你的模型视图集

urlpatterns = [
    path('', include(router.urls)),
]

views.py

from rest_framework import viewsets
from .models import YourModel  # 替换为你的模型
from .serializers import YourModelSerializer  # 替换为你的序列化器

class YourModelViewSet(viewsets.ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

serializers.py

from rest_framework import serializers
from .models import YourModel  # 替换为你的模型

class YourModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = YourModel
        fields = '__all__'  # 或者指定具体的字段

2. 在Flutter前端调用API

在Flutter中,你可以使用http包或dio包来调用Django后端API。下面是一个使用http包的示例:

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保使用最新版本

main.dart

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter & Django Integration'),
        ),
        body: Center(
          child: FutureBuilder<List<dynamic>>(
            future: fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return ListView.builder(
                  itemCount: snapshot.data!.length,
                  itemBuilder: (context, index) {
                    Map<String, dynamic> item = snapshot.data![index];
                    return ListTile(
                      title: Text('${item['field_name']}'),  # 替换为你的字段名
                    );
                  },
                );
              }
            },
          ),
        ),
      ),
    );
  }
}

Future<List<dynamic>> fetchData() async {
  final response = await http.get(Uri.parse('http://your-django-server.com/your-models/'));

  if (response.statusCode == 200) {
    List<dynamic> body = jsonDecode(response.body);
    return body;
  } else {
    throw Exception('Failed to load data');
  }
}

在这个示例中,fetchData函数通过HTTP GET请求从Django后端获取数据,并在Flutter应用中显示这些数据。你需要将http://your-django-server.com/your-models/替换为你的Django后端API的实际URL。

请注意,这只是一个基本的集成示例。根据你的djangoflow_app的具体功能和API,你可能需要调整代码,例如处理POST请求、身份验证、错误处理等。

回到顶部