| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import 'package:flutter/material.dart';
- import 'package:flutter_riverpod/flutter_riverpod.dart';
- import 'package:webview_flutter/webview_flutter.dart';
- import '../services/api_service.dart';
- import '../providers/app_provider.dart';
- import '../models/problem.dart';
- /// 题目预览 Widget — WebView 渲染服务端 HTML+MathML(Android)
- class ProblemPreview extends ConsumerStatefulWidget {
- final Problem problem;
- final bool showAnswer;
- const ProblemPreview({super.key, required this.problem, this.showAnswer = true});
- @override
- ConsumerState<ProblemPreview> createState() => _ProblemPreviewState();
- }
- class _ProblemPreviewState extends ConsumerState<ProblemPreview> {
- WebViewController? _controller;
- @override
- void initState() {
- super.initState();
- _initController();
- }
- @override
- void didUpdateWidget(ProblemPreview oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (oldWidget.problem.id != widget.problem.id || oldWidget.showAnswer != widget.showAnswer) {
- _initController();
- }
- }
- void _initController() {
- _controller = WebViewController()
- ..setJavaScriptMode(JavaScriptMode.unrestricted);
- _loadContent();
- }
- Future<void> _loadContent() async {
- final api = ref.read(apiServiceProvider);
- final baseUrl = api.baseUrl ?? '';
- final token = api.token ?? '';
- final answerParam = widget.showAnswer ? 'true' : 'false';
- final viewUrl = '$baseUrl/api/problems/${widget.problem.id}/view'
- '?include_answer=$answerParam&token=$token';
- _controller?.loadRequest(Uri.parse(viewUrl));
- }
- @override
- Widget build(BuildContext context) {
- if (_controller == null) {
- return const Center(child: CircularProgressIndicator());
- }
- return WebViewWidget(controller: _controller!);
- }
- }
|